问题描述
|
我有以下课程:
class A {
Integer id;
@OnetoMany(mappedBy=\"parent\",fetch=FetchType.EAGER,cascade={CascadeType.ALL})
Set<B> children;
}
class B {
Integer id;
@ManyToOne(fetch=FetchType.EAGER)
A parent;
}
数据库中有数据,比如说a1以{b1,b2,b3}作为子级。
当我尝试将a1的子集更新为{b4,b5}时,我最终在数据库中出现了b1..b5。
在我的代码中,我谨防在子集上调用clear()
,但这不会影响数据库。
我应该迭代并在A \的每个孩子上叫session.delete(child)
吗?
谢谢,
解决方法
从Java EE 6(和Hibernate 3.5)开始,您应该使用@OneToMany(...,orphanRemoval = true)
在Java EE 6 / Hibernate 3.5之前,可以使用
org.hibernate.annotations.CascadeType.DELETE_ORPHAN
,在3.5中已弃用了in3ѭ,以便在JPA中添加orphanRemoval。
, 问题是Cascade.All在所有子项上。基本问题是,即使您清除父对象上的集合,子对象也将自身保存为具有a1作为父对象。这意味着您需要清除关系的两面。有两条路线:
删除子项上的cascade.all,并让父对象管理整个关系。
清除子元素上的父元素,或完全从会话中删除它们,自己手动处理这些关系。选择此路线时,您需要非常明确地了解集合中每个元素所发生的情况。