Я новичок в спящем режиме и пытаюсь понять концепцию каскада.
Я изучил документацию по спящему режиму, но некоторые вещи мне неясны:
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();
}