java - 验证 Jpa 实体 : In service or by lifecycle listeners

标签 java validation architecture jpa design-patterns

问题是将 Jpa 实体的业务验证逻辑放在哪里更好(或者换句话说:您更喜欢在哪里)。

两个想法是:

  1. 在 EntityListener 中,在保存或更新之前将验证实体
  2. 在提供对 jpa 持久化方法的访问的服务中。

两者各有利弊。 当使用方法 2 时,它更容易测试,因为您可以模拟 jpa 提供程序并测试验证逻辑。另一方面,对于方法 1,验证将与 @NotNull 等验证同时发生。

我很想知道你们如何解决项目中的验证问题,哪种方法更好。

谢谢。

最佳答案

这是我遵循的一般经验法则:

When using bean validation, specify rules that do not require dependencies on other beans. The moment you depend on another bean, get your service layer to handle that dependency.

换句话说,如果您在另一个 bean 中引用了一个 bean,请避免放入 @NotNull 约束。您的服务层最适合用于此目的,因为您可以更早地在更合乎逻辑的点捕获违规(因为其他业务验证会假定 bean 可用)。

例如,考虑以下实体(抱歉无法编译)

@Entity
public class User
{
   @Id
   private int id;
   @NotNull
   private String fullName;
   @NotNull
   private String email;
   private Set<Role> roles; //No bean validation constraints here.
   ...
   public boolean mapRoleToUser(Role role)
   { //Validation is done here. Including checks for a null role.
   }

}

@Entity
public class Role
{
  @Id
  private int id;
  @NotNull
  private String name;
}

在这种情况下,服务层应该验证用户是否附加了角色。 pre-persist 或 pre-update 阶段的验证有点太晚了,尤其是当有一个具有业务逻辑的不同服务层,以及领域模型中的其余业务逻辑时(遗憾的是,我还没有看到仅域模型中的所有逻辑就足够好的应用程序了)。

关于java - 验证 Jpa 实体 : In service or by lifecycle listeners,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3370670/

相关文章:

java - 从 xml 文档中提取纯文本的最简单方法是什么?

java - 验证 JAR 作为输入流而不保存临时文件

asp.net-mvc - 我如何处理抽象出第 3 方依赖项(依赖注入(inject))?

java - 使用 ModelDriven 时如何执行 XML 验证?

php - 在 Zend_Form 类中的 addElement() 上使用 Between 验证器

java - 单页应用程序: page reload

android - 在多模块/层 Android 架构中导航

java - JTextField:当文本字段已满/自动跳过/自动制表符时聚焦下一个组件

java - 我如何剖析或分析这个正则表达式?

java - java中是否有任何方法与Visual C++中的ReadInt16()具有相同的功能