Как обновить коллекцию в спящем режиме? - PullRequest
0 голосов
/ 13 июня 2011

У меня есть следующие классы:

class A {
  Integer id;

  @OneToMany(mappedBy="parent", fetch=FetchType.EAGER, cascade={CascadeType.ALL})
  Set<B>  children;
}

class B {
  Integer id;

  @ManyToOne(fetch=FetchType.EAGER)
  A parent;
}

в базе данных есть данные, скажем, a1, у которых {b1, b2, b3} дочерние элементы. когда я пытаюсь обновить набор дочерних элементов a1 до {b4, b5}, я получаю в базе данных b1..b5. в моем коде я принимаю меры предосторожности при вызове clear() для набора детей, но это не влияет на базу данных.

Должен ли я повторить и вызвать session.delete(child) для каждого потомка А?

спасибо,

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

В Java EE 6 (и Hibernate 3.5) следует использовать @ OneToMany (..., orphanRemoval = true)

До Java EE 6 / Hibernate 3.5 вы можете использовать org.hibernate.annotations.CascadeType.DELETE_ORPHAN, который был устаревшим в 3.5 в пользу добавления orphanRemoval в JPA.

0 голосов
/ 13 июня 2011

Проблема в каскаде. Все на дочерних элементах. Основная проблема заключается в том, что даже если вы очищаете набор родительского объекта, дочерние объекты сохраняют себя как имеющие a1 в качестве родительского. Это означает, что вам нужно очистить ОБА стороны отношений. Есть два маршрута:

  1. Удалите cascade.all на дочерних элементах и ​​разрешите родительскому объекту управлять всеми отношениями.

  2. Вручную обработайте отношения самостоятельно, очистив родительский элемент от дочерних или полностью удалив их из сеанса. При выборе этого маршрута вам нужно ОЧЕНЬ четко указать, что происходит с каждым элементом в наборе.

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