java - 如何避免与 JPA 级联重复?

标签 java jpa

我有一个Parent 实体,它有一个Child 实体,处于ManyToOne 关系中:

@Entity class Parent {
  // ...
  @ManyToOne((cascade = {CascadeType.ALL})
  private Child child;
  // ...
}

Child 有一个独特的字段:

@Entity class Child {
  // ...
  @Column(unique = true)
  private String name;
  // ...
}

当我需要一个新的 Child 时,我首先询问 ChildDAO:

Child child = childDao.findByName(name);
if(child == null) {
  child = new Child(name);
}

Parent parent = new Parent();
parent.setChild(child);

问题是,如果我喜欢上面的两次(同名),并且只坚持在最后,我得到了一个约束异常。这看起来很正常,因为最初数据库中没有指定名称的子项。

问题是,我不确定避免这种情况的最佳方法是什么。

最佳答案

您正在使用 new Child() 两次创建 Child 的两个非持久实例,然后将它们放入两个不同的 Parents 中。当您持久化 Parent 对象时,两个新的 Child 实例中的每一个都将通过级联持久化/插入,每个都有不同的 @Id。然后名称的唯一约束就会中断。如果您正在执行 CascadeType.ALL,那么每次您执行 new Child() 时,您可能会得到一个单独的持久对象。

如果您真的希望将两个 Child 实例视为具有相同 ID 的单个持久对象,则需要将其单独持久化以与持久化上下文/ session 相关联。对 childDao.findByName 的后续调用将刷新插入并返回您刚刚创建的新 Child,因此您不会执行两次 new Child()

关于java - 如何避免与 JPA 级联重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8288501/

相关文章:

java - 日期不正确

java - GZIPInputStream 和字符集

java - JPA 使用 CriteriaUpdate 将元素添加到集合

java - JPA JOIN 查询列表仅给出一项而不是所有项

MySQL LIKE 多字段条件

java - Worklight 6 升级失控

java - 使用后增量控制 while 循环的流程

java - 如何通过Intent传输图像?

java - 如何停止除当前线程之外的所有正在运行的线程?

java - 传递给持久化的 Hibernate 分离实体