我有以下课程:
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)
吗?
感谢,
答案 0 :(得分:2)
从Java EE 6(和Hibernate 3.5),你应该使用@OneToMany(...,orphanRemoval=true)
在Java EE 6 / Hibernate 3.5之前,您可以使用org.hibernate.annotations.CascadeType.DELETE_ORPHAN
,这在3.5中已弃用,而有利于将JPO添加到orphanRemoval中。
答案 1 :(得分:0)
问题是Cascade.All关于子项目。基本问题是,即使您正在清除父对象上的集合,子对象也会将自己保存为具有a1作为父对象。这意味着您需要清除关系的两个方面。有两条路线:
删除子项上的cascade.all,让父对象管理整个关系。
通过清除子元素上的父元素或者从会话中全部删除它们来手动处理关系。在选择此路线时,您需要非常明确地了解集合中每个元素会发生什么。