Отображение спящего режима: каскад удаления-сироты - PullRequest
0 голосов
/ 02 апреля 2012

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

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

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

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

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

В этом случае каскадирование не работаети удаленный ребенок не осиротел.Он по-прежнему представлен в БД.

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

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

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

1 Ответ

0 голосов
/ 08 апреля 2012

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

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

...