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

标签 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 等注释创建自定义 validator 。
  2. 创建一个名为 ssnAvailable 的 transient 属性,该属性将由 PersonService 填充。

最佳答案

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

这就是服务通常的用途。运行搜索具有特定 SSN 的人员的查询是完全有效的。在 PersonService 中,签名可能如下所示:

 public boolean isSsnPresent(String ssn)

如果您想在尝试将人员保存到数据库之前检查 SSN 是否存在,那么唯一约束对您没有帮助。

关于java - Bean 验证 + 数据库访问 + 断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50556868/

相关文章:

design-patterns - 服务和 DAO 与 MVC

spring - 嵌套验证组,Spring,JSR 303

java - 使用 JSR-303 进行方法参数验证

java - 如何从单个文件保存多个对象?

java - 是否有正则表达式方法将一组字符替换为另一组字符(如 shell tr​​ 命令)?

c# - 为什么我应该为具体的 DataProvider 类创建接口(interface)

ms-access - VBA-使用DAO对象的运行时错误3271

spring - 如何在执行 JSR-303 验证之前将 PathVariable id 注入(inject) RequestBody?

java - 由于错误的身份验证 tomcat,X11 连接被拒绝

Java:使用等于覆盖从列表中删除对象