Я знаю, что удаление дочерних объектов-сирот - это распространенный вопрос о SO и общая проблема для людей, новых для Hibernate, и что довольно стандартный ответ заключается в том, чтобы вы имели некоторые изменения cascade=all,delete-orphan
или cascade=all-delete-orphan
на детская коллекция.
Я бы хотел, чтобы Hibernate обнаружил, что дочерняя коллекция была опустошена/удалена из родительского объекта, а строки в дочерней таблице удалены из базы данных при обновлении родительского объекта. Например:
Parent parent = session.get(...);
parent.getChildren().clear();
session.update(parent);
Мое текущее сопоставление для класса Parent
выглядит следующим образом:
<bag name="children" cascade="all-delete-orphan">
<key column="parent_id" foreign-key="fk_parent_id"/>
<one-to-many class="Child"/>
</bag>
Это работает отлично для меня при обновлении прикрепленного объекта, но у меня есть прецедент, в котором мы хотели бы иметь возможность отделить отдельный объект (который был отправлен нашему API-методу удаленным клиентом по HTTP/JSON) и передать его непосредственно на сеанс Hibernate - чтобы клиенты могли манипулировать родительским объектом в зависимости от того, что им нравится, и чтобы изменения сохранялись.
При вызове session.update(parent)
в моем отдельном объекте строки в дочерней таблице становятся сиротами (для столбца FK установлено значение null), но не удаляются. Обратите внимание, что когда я звоню session.update()
, это первый сеанс Hibernate Session, который видит этот экземпляр объекта - я не присоединяю или не скрепляю объект с сеансом каким-либо другим способом. Я полагаюсь на клиента, чтобы передать объекты, идентификаторы которых соответствуют реальным объектам в базе данных. Например, логика в моем сервис-методе API выглядит примерно так:
String jsonString = request.getParameter(...);
Parent parent = deserialize(jsonString);
session.update(parent);
Возможно ли, чтобы Hibernate обнаружил дочерние коллекции для детей-сирот в изолированных родительских объектах при передаче в session.update(parent)
? Или я неправильно использую отдельный объект?
Моя надежда заключалась в том, что я мог избежать любых сложных взаимодействий с Hibernate, чтобы сохранить изменения в отдельном экземпляре. Мой API-метод не нуждается в дальнейшем изменении отдельного объекта после вызова session.update(parent)
, этот метод просто отвечает за сохраняющиеся изменения, сделанные удаленными клиентскими приложениями.