以下是我的实体:
@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;
...
}
我想执行以下操作:
parent.setChild(child)
)。 这是我尝试的但它为父母提出了ConstraintViolationexception
:
entityManager.remove(parent.getChild())
parent.setChild(new Child())
entityManager.merge(parent);
我该如何解决这个问题?
答案 0 :(得分:3)
“老”的孩子可能仍然引用父母,而新孩子则没有。两者都是一个问题。
除了删除旧子项外,还应将子实例的parent
引用设置为null
。
除了将新子项添加到父项之外,还需要将父项添加到子项中以提供外键。
不要从多方(孩子)到一方(父母)级联。此类级联的行为未定义,可能以意外的方式工作。
编辑:JPA 2.0规范要说的是什么:
请注意,应用程序负责维护 运行时关系的一致性 - 例如,for 确保双向的“一”和“多”两面 申请时,关系是彼此一致的 在运行时更新关系。
答案 1 :(得分:0)
修改父级中的关系,如下所示:
@OneToMany(cascade = {CascadeType.ALL}, orphanRemoval=true, mappedBy = "parent")
只需将新子项设置为父项并合并父项。现在,之前引用的子项成为孤儿,JPA会在提交事务时自动删除它们。
谢谢, JK