我正在使用具有以下父子关系的 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>
如果执行下面的代码,child(ren)的parent_id
列只会被设置为NULL,但记录不会被删除。我希望子记录也被删除,但无法弄清楚。
parent.getChildren().clear();
session.update(parent);
如果我用一个空集合更新父集合,我怎样才能让子集合被删除?
最佳答案
在 Hibernate 中,如果您有一个 ManyToOne,那么它始终是关系的第一类拥有方(除非您的 ManyToOne 由连接表而不是多方的列表示)。换句话说,没有办法在关系的 Many 端设置 inverse=true
。
当您创建一个 OneToMany 时,如果您指定 inverse=false
那么您将创建关系的另一个一等拥有方。
您创建的是一个无效的场景,Hibernate 认为存在两个完全独立的关系并且没有将它们链接在一起。
以下场景有效:
- 只有带
inverse=false
的OneToMany - 只有ManyToOne
- 在 OneToMany 上同时使用
inverse=true
的 OneToMany 和 ManyToOne - 使用连接表
我不知道有什么方法可以建立一方是拥有方的双向关系。如果您想要双向关系,可能最简单的解决方法是在 Parent
类上设置 inverse=true
,然后将您的代码调整为:
for(ImplementationProjectChange child : parent.getChildren()) {
child.setParent(null);
}
parent.getChildren().clear();
session.update(parent);
关于java - 清除关联子项列表后的 session 更新不会删除它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17115710/