我对某种情况感到困惑。想象一下像Person这样的课程:
@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填充。答案 0 :(得分:2)
尝试在域中考虑。是Person
负责检查其中一个属性是否在所有Persons
中都是唯一的?不,它不是,它不应该具备这样做的能力。
这就是Service
通常的用途。运行查询以搜索具有特定SSN
的Person是完全有效的。在PersonService
中,签名看起来像这样:
public boolean isSsnPresent(String ssn)
如果您想在尝试将Person保存到数据库之前检查SSN
是否存在,则唯一约束不会对您有所帮助。
答案 1 :(得分:0)
你应该做的是捕获抛出的唯一约束违规异常并抛出你自己的自定义异常或返回你想要的正确消息...如果抛出的异常与唯一约束违规没有直接关系,你可以得到使用
导致异常e.getCause()
然后更改是否是唯一约束违规并返回正确的消息。