JavaBean验证+数据库访问+断言
我对一种情况感到困惑。想象一个像班上人一样的人:
@Entity
class Person {
@NotBlank(message="Some message")
@Column(name="ssn", nullable=false, unique=true)
String ssn;
...
}
嗯,ssn
必须是唯一的,我可以通过使用unique=true
语句来实现这一点,但是为了向用户显示一些消息,最好使用断言:
@AssertTrue(message="SSN is already in use.")
public boolean isSsnAvailable() {
// database query
}
你们认为这是个好习惯吗?对我来说,这有点奇怪,因为通过向实体添加数据库访问,它似乎变得太复杂了
我考虑了另外两种可能性:
- 使用类似
@Unique
的注释创建自定义验证器李> - 创建名为
ssnAvailable
的临时属性,该属性将由PersonService填充李>
# 1 楼答案
您应该做的是捕获抛出的唯一约束冲突异常,并抛出您自己的自定义异常或返回您想要的正确消息。。。如果抛出的异常与唯一约束冲突没有直接关系,可以使用
然后,如果是唯一的约束冲突,则进行更改,并返回正确的消息
# 2 楼答案
试着在领域中思考。一个
Person
是否负责检查它的一个属性在所有Persons
属性中是否是唯一的?不,它不是,它不应该拥有这样做的能力这就是
Service
的典型用途。运行查询来搜索具有特定SSN
的人是完全有效的。在PersonService
中,签名可以是这样的:如果要在尝试将此人保存到数据库之前检查
SSN
是否存在,则唯一约束对您没有帮助