我正在使用具有以下父子关系的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);

07-24 09:34