jpa удаление элемента из списка - PullRequest
23 голосов
/ 04 января 2011

У меня есть отношение 1-N (у объекта есть список), и я хочу удалить один элемент из списка.Как правильно удалить элемент в списке с помощью JPA?

Нужно ли сначала обновлять список и объединять владельца, а затем удалять элемент (если я не удаляю элемент и просто объединяю владельцасирота останется в БД, верно)?В какой последовательности должны вызываться функции merge () и remove (), имеет ли значение порядок удаления () и merge ()?

Пример кода:

List<Item> items = owner.getItems();
Item itemToRemove = items.get(index);
owner.remove(itemToRemove);
em.merge(owner);
em.remove(itemToRemove);

Ответы [ 4 ]

18 голосов
/ 04 января 2011

Это должно работать, если у вас orphanRemoval=true (JPA 2.0).

Для JPA 1 не существует стандартного способа справиться с этим. Hibernate имеет @Cascade, где вы можете указать DELETE_ORPHAN

15 голосов
/ 04 января 2011

Этого достаточно:

List<Item> items = owner.getItems();
Item itemToRemove = items.get(index);
items.remove(itemToRemove);

При сбросе EntityManager ссылка между owner и itemToRemove будет удалена. И если для cascade установлено значение CascadeType.ALL, itemToRemove также будет удален.

На самом деле, более короткая (и эквивалентная) версия такова:

List<Item> items = owner.getItems();
// no need to keep a reference to the object that has to be removed
items.remove(index);

Справка:

14 голосов
/ 05 января 2011

Спасибо, ребята, за ответы.Ваши ответы очень похожи, но есть некоторые незначительные различия.

Просто хочу убедиться, что я правильно понимаю:

  1. В JPA 1.0 (в общем) я должен вызвать remove() на ссылочные объекты.Они не будут удалены при сбое менеджера сущностей.В противном случае бесхозный объект останется в БД.
  2. В JPA 1.0 с реализацией Hibernate при установке DELETE_ORPHAN указанная сущность удаляется с очисткой менеджера сущностей.Нет необходимости вызывать remove ().
  3. В JPA 2.0 (в общем случае), когда orphanRemoval = true, ссылка на сущность удаляется с помощью сброса менеджера сущностей.Не нужно вызывать remove ().Если orphanRemoval не установлен, необходимо вызвать remove () для удаления ссылочной сущности.
2 голосов
/ 04 января 2011

Обычно вам не нужно делать ничего подобного.

Если коллекция правильно сопоставлена, вам следует вызвать items.remove (itemToRemove), и это все.

Когда вы закрываете EntityManager (это вызывает запись изменений в базу данных), он должен автоматически распознать, что элемент был удален (потерян) из владельца и удалить его из базы данных. По крайней мере, Hibernate работает таким образом, и можно указать DELETE_ORPHAN в качестве каскада для отображения коллекции.

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