在Hibernate中级联一对多和多对多

时间:2011-11-15 14:12:41

标签: hibernate many-to-many one-to-many cascade

我是hibernate的新手,我正在尝试理解级联概念。

我研究过hibernate文档,但有些事情我不清楚:

1)如何在双向一对多关系中使用级联:

假设我有父母,父母可以有零个或多个孩子。

行为应该是: - 如果删除了父对象,则也应删除其所有子对象。 - 删除一个孩子应该是可能的。因此,只应删除父项与此单个子项之间的关系/连接,而不是父项。

我的父配置文件如下所示:

<class name="Parent" table="Parent">
     <set name="children" table="Child" fetch="select">
            <key>
                <column name="Parent_id" not-null="true" />
            </key>
            <one-to-many class="Child" />
        </set>
</class>

子配置文件:

<class name="Child" table="Child">
    <many-to-one name="parent" class="Parent" fetch="select">
            <column name="Parent_id" not-null="true" />
    </many-to-one>
</class>

如何指定级联行为(在Child或Parent中)? 我的DAO如何删除这个孩子? 我想通过正确配置级联非常简单, 这样简单的删除

public void deleteChild(Child child){
    Transaction tx = session.beginTransaction();    
    session.delete(childObject);
    tx.commit();
}

足以删除父对象中的连接, 或DAO是否需要以这种方式手动删除连接:

public void deleteChild(Child child){
    Transaction tx = session.beginTransaction();    
    Parent p = child.getParent();
    p.getChildren().remove(p);
    session.delete(childObject);
    session.update(p);
    tx.commit();
}

2)我的第二个问题类似于第一个问题,但这次我使用了双向的多对多关系:

让我们说: - 类用户和用户可以是零个或多个组的成员 - 一个组可以包含零个或多个用户

因此,如果我删除用户,则只应删除用户和与该组的关系,而不删除该用户所属的组,反之亦然。

如果我删除了一个组,则应该删除该组以及与该用户的关系,而不是该组的成员用户。

用户的配置文件:

<class name="User" table="User">
    <set name="groups" table="UserGroupMember" inverse="true">    <!-- inverse = true, since i want that the Group adds User as member -->    
        <key column="User_id" />         
        <many-to-many column="group_id" class="Group"/>    
    </set> 
</class>

以及该组的配置:

<class name="Group" table="Groups">
    <set name="users" table="UserGroupMember" inverse="false">        
            <key column="Group_id" />         
            <many-to-many column="User_id" class="User" />    
    </set>
</class>

在这种情况下如何设置级联? DAO怎么样?

是一个简单的session.delete(group)还是需要像这样手动删除关系:

public void deleteGroup(Group group)
{
    Transaction tx = session.beginTransaction();
    for (User u: group.getUsers())
    {
        u.getGroups().remove(group);
        session.update(u);
    }

    group.getUsers().clear();
    session.update(group);
    session.delete(group);
    tx.commit();
}

0 个答案:

没有答案