Каскад в спящем режиме с одной стороны на много - PullRequest
2 голосов
/ 16 июля 2010

я знаю, что этот вопрос можно было задавать раньше, но я хочу сделать его конкретным,

я использую hibernate без аннотаций, поэтому мой случай, если у меня есть следующее отношение:

A имеет множество B, а B имеет одно из A, это отношение один ко многим со стороны A, я имею дело с сущностью, которая содержит набор B, затем при создании, обновлении B во время выполнения с использованием A, затем сохранении или Обновление A с использованием Hibernate, я хочу, чтобы оно также сохраняло или обновляло B, т.е. каскадное сохранение удаляло, но со стороны A (один ко многим), я думаю, что это разрешено только со стороны B (много к одному)

Regads

Ответы [ 2 ]

3 голосов
/ 16 июля 2010

Я не уверен, что понял вопрос, но определенно возможно определить каскадные операции для связи один-ко-многим (см. Раздел 6.2. Отображения коллекции ).Ниже выписка из главы 21. Пример: Родитель / ребенок :

21.3.Каскадный жизненный цикл

Вы можете устранить разочарования явного вызова save () с помощью каскадов.

<set name="children" inverse="true" cascade="all">
    <key column="parent_id"/>
    <one-to-many class="Child"/>
</set>

Это упрощает приведенный выше код до:

Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
p.addChild(c);
session.flush();

Аналогично, нам не нужно перебирать дочерние элементы при сохранении или удалении Parent.Следующее удаляет p и все его дочерние элементы из базы данных.

Parent p = (Parent) session.load(Parent.class, pid);
session.delete(p);
session.flush();

Однако следующий код:

Parent p = (Parent) session.load(Parent.class, pid);
Child c = (Child) p.getChildren().iterator().next();
p.getChildren().remove(c);
c.setParent(null);
session.flush();

не удалит c из базы данных.В этом случае будет удалена только ссылка на p, что приведет к нарушению ограничения NOT NULL.Вам необходимо явно delete() Child.

Parent p = (Parent) session.load(Parent.class, pid);
Child c = (Child) p.getChildren().iterator().next();
p.getChildren().remove(c);
session.delete(c);
session.flush();

В нашем случае Child не может существовать без своего родителя.Поэтому, если мы удалим Child из коллекции, мы хотим, чтобы он был удален.Чтобы сделать это, мы должны использовать cascade="all-delete-orphan".

<set name="children" inverse="true" cascade="all-delete-orphan">
    <key column="parent_id"/>
    <one-to-many class="Child"/>
</set>

Даже при том, что в отображении коллекции указано inverse="true", каскады по-прежнему обрабатываются путем итерации элементов коллекции.Если вам нужно, чтобы объект был сохранен, удален или обновлен каскадом, вы должны добавить его в коллекцию.Недостаточно просто позвонить setParent().

Рекомендации

0 голосов
/ 16 июля 2010

Каскады работают с однонаправленными коллекциями. Просто добавьте «cascade = all» или даже cascade = «all-delete-orphan», чтобы дочерняя сущность была удалена, если она будет удалена из коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...