Как удалить старые дочерние записи при обновлении родительского объекта - PullRequest
2 голосов
/ 07 февраля 2011

В настоящее время я работаю над двунаправленной ассоциацией OneToMany Hibernate, используя аннотации. Я застрял с проблемой.

Родительская сущность имеет много дочерних сущностей. Всякий раз, когда я обновляю дочерний набор в Parent и пытаюсь обновить родительский объект, все же старые дочерние записи существуют в дочерней таблице. поэтому Parent содержит дубликаты дочерних записей.

Всякий раз, когда я обновляю родительскую сущность, ее дочерние записи автоматически также должны корректно обновляться без дубликатов, что означает, что уже существующие дочерние сущности должны быть удалены.

Я гуглил и обнаружил, что есть грязный способ добиться этого. Получение существующих дочерних сущностей Parent и итерация каждого дочернего объекта и удаление каждого дочернего объекта с помощью session.delete (child). Это очень плохой подход, я знаю.

Можем ли мы достичь вышеуказанного лучше, используя аннотации? Пожалуйста, помогите мне в решении этой проблемы.

1 Ответ

5 голосов
/ 07 февраля 2011

Используйте настройку каскада delete-orphan . При удалении ребенка от родителя он будет удален.

Вам нужно будет изменить коллекцию, которая была загружена и существует в сеансе, чтобы delete-orphan работал. Это означает, что коллекция должна быть PersistentSet или чем-то еще, и вы удаляете и добавляете в нее объекты.

Что-то вроде

Set<Product> newProducts = new HashSet<Products>();
newProducts.add(prod1);
newProducts.add(prod2);
order.setProducts(newProducts);

только установит parent_id в таблице товаров на null, но не удалит их. Теперь что-то вроде

Set<Product> products = order.getProducts();
products.clear();
products.add(prod1);
products.add(prod2);

должен удалить детей.

И помните, что для удаления любой сироты заказы и продукты должны быть загружены и присутствовать в сеансе.

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