Отображение гибернации: удаление-сирота каскад

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

Итак, я загружаю Parent P с двумя дочерними объектами A и B. Затем я удаляю дочерний объект A из родительской коллекции (.getChildren(). Remove(A)) и вызываю session.saveOrUpdate(P) для сохранения родительского объекта. Так как установлен каскад all-delete-orphan, родительский объект сохраняется с одним дочерним элементом, а другой удаленный дочерний элемент (A) удаляется из БД. Это правильное поведение.

Как я понимаю, когда hibernate загружает такой объект (P), он оборачивает свой список дочерних элементов в некоторую коллекцию Persistent (например, PersistentSet), и все манипуляции с этой коллекцией перехватываются hibernate, и это позволяет ему решить, какие дочерние элементы должны быть удалены сиротами из БД.

Но.. У меня есть следующая архитектура проекта:

После того, как сущность является загрузчиком из db (объект DO), она передается в службу (объект фасада), где она преобразуется в объект с использованием инфраструктуры Dozer. После преобразования постоянная коллекция из объекта DO преобразуется в простой ArrayList в TO. Затем он передается в пользовательский интерфейс, где его можно изменить (удалить дочерний элемент A из дочерней коллекции). Когда мы хотим сохранить его, мы передаем его на фасад, где с помощью Doser он преобразуется обратно в объект DO, а затем мы сохраняем его в БД (используя session.saveOrUpdate).

В этом случае каскадирование не работает, и удаленный ребенок не становится сиротой. Это все еще представлено в БД.

Каскадирование работает, только если мы вызываем.merge insted из saveOrUpdate. Я предполагаю, что это потому, что hibernate автоматически связывает наш объект с сеансом, а затем делает обновление для него.

Итак, кто-нибудь может описать мне это поведение? Можно ли поддерживать каскад удаления-удаления, используя такое преобразование DO -> TO -> DO?

Это просто общий сценарий и общий вопрос. При необходимости я смогу прикрепить код / ​​сопоставления и т. Д.

1 ответ

session.saveOrUpdate для отслеживаемых объектов, session.merge для неотслеживаемых объектов

session.merge предназначен для этого сценария. У вас есть неотслеживаемая сущность с изменениями, которые должны быть записаны обратно. Слияние будет загружать объекты на основе идентификаторов объектов (примечание: каскадирование), которые вы ему дадите, и скопирует состояние в эти отслеживаемые объекты, и изменения будут сохранены при следующей очистке.

Другие вопросы по тегам