Каскад в Hibernate один-ко-многим и многие-ко-многим - PullRequest
3 голосов
/ 15 ноября 2011

Я новичок в спящем режиме и пытаюсь понять концепцию каскада.

Я изучил документацию по спящему режиму, но некоторые вещи мне неясны:

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