删除并保存Child:JPA

时间:2014-06-18 08:01:07

标签: java jpa

以下是我的实体:

@Entity
public class Parent {
    @Id
    @Column(name = "ID")
    private Long id;

    @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
    private Set<Child> childs = new HashSet<Child>();

 ...
}
The child:

@Entity
public class Child {
    @Id
    @Column(name = "ID")
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="PARENTID", nullable = false)
    private Parent parent;

  ...
}

我想执行以下操作:

  1. 从父级删除子实体(不是父级本身)。
  2. 将新的子实体添加到父级(parent.setChild(child))。
  3. 现在将子实体保存到DB并相应地更新父级。
  4. 这是我尝试的但它为父母提出了ConstraintViolationexception

    entityManager.remove(parent.getChild())
    parent.setChild(new Child())
    entityManager.merge(parent);
    

    我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

“老”的孩子可能仍然引用父母,而新孩子则没有。两者都是一个问题。

除了删除旧子项外,还应将子实例的parent引用设置为null

除了将新子项添加到父项之外,还需要将父项添加到子项中以提供外键。

不要从多方(孩子)到一方(父母)级联。此类级联的行为未定义,可能以意外的方式工作。

编辑:JPA 2.0规范要说的是什么:

  

请注意,应用程序负责维护   运行时关系的一致性 - 例如,for   确保双向的“一”和“多”两面   申请时,关系是彼此一致的   在运行时更新关系。

答案 1 :(得分:0)

修改父级中的关系,如下所示:

    @OneToMany(cascade = {CascadeType.ALL}, orphanRemoval=true, mappedBy = "parent")

只需将新子项设置为父项并合并父项。现在,之前引用的子项成为孤儿,JPA会在提交事务时自动删除它们。

谢谢, JK