Bean验证+数据库访问+断言

时间:2018-05-27 21:55:43

标签: java dao bean-validation

我对某种情况感到困惑。想象一下像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
}

你们认为这是一个好习惯吗?对我来说有点奇怪,因为通过添加数据库访问,实体似乎变得过于复杂。

我想到了另外两种可能性:

  1. 使用@Unique
  2. 等注释创建自定义验证程序
  3. 创建一个名为ssnAvailable的瞬态属性,该属性将由PersonService填充。

2 个答案:

答案 0 :(得分:2)

尝试在域中考虑。是Person负责检查其中一个属性是否在所有Persons中都是唯一的?不,它不是,它不应该具备这样做的能力。

这就是Service通常的用途。运行查询以搜索具有特定SSN的Person是完全有效的。在PersonService中,签名看起来像这样:

 public boolean isSsnPresent(String ssn)

如果您想在尝试将Person保存到数据库之前检查SSN是否存在,则唯一约束不会对您有所帮助。

答案 1 :(得分:0)

你应该做的是捕获抛出的唯一约束违规异常并抛出你自己的自定义异常或返回你想要的正确消息...如果抛出的异常与唯一约束违规没有直接关系,你可以得到使用

导致异常
e.getCause()

然后更改是否是唯一约束违规并返回正确的消息。