我正在使用具有以下父子关系的Hibernate 2.1.8:
public class Parent {
private Set<Child> children = new HashSet<Child>();
}
public class Child{
private Parent parent;
}
Hibernate映射如下所示:
<hibernate-mapping>
<class name="Parent" table="parent">
<id name="id" column="parent_id" unsaved-value="0" type="int">
<generator
class="com.mx.releasemgr.db.hibernate.HibernateIdentityGenerator" />
</id>
...
<set name="children" table="child" inverse="false" cascade="all-delete-orphan">
<key column="parent_id" />
<one-to-many class="child"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.mx.releasemgr.domain.ImplementationProjectChange" table="implementation_project_change" >
<id name="id" column="implementation_project_change_id" unsaved-value="0" type="int">
<generator class="com.mx.releasemgr.db.hibernate.HibernateIdentityGenerator"/>
</id>
<many-to-one name="parent" column="parent_id" class="Parent" not-null="true"/>
</class>
</hibernate-mapping>
如果执行以下代码,则子级的
parent_id
列仅设置为NULL,但不会删除该记录。我希望子记录也被删除,但无法弄清楚。parent.getChildren().clear();
session.update(parent);
如果我用空集合更新父项,如何删除子项?
最佳答案
在Hibernate中,如果您有ManyToOne,则它始终是关系的一等拥有方(除非您的ManyToOne由联接表而不是多方列表示)。换句话说,无法在关系的“多”端设置inverse=true
。
创建OneToMany时,如果指定inverse=false
,则将创建该关系的另一个一流拥有方。
您创建的是一个无效的场景,其中Hibernate认为存在两个完全独立的关系,并且没有将它们链接在一起。
以下情况是有效的:
仅具有inverse=false
的OneToMany
只有ManyToOne
在OneToMany上同时具有OneToMany和ManyToOne和inverse=true
使用联接表
我不知道以一方为拥有方的双向关系。如果需要双向关系,最简单的解决方法可能是在inverse=true
类上设置Parent
,然后将代码调整为:
for(ImplementationProjectChange child : parent.getChildren()) {
child.setParent(null);
}
parent.getChildren().clear();
session.update(parent);