我是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();
}