Я знаю, что удаление дочерних объектов-сирот является распространенным вопросом о SO и общей проблемой для людей, новых для Hibernate, и что довольно стандартный ответ заключается в том, чтобы у вас есть некоторые варианты cascade=all,delete-orphan
или cascade=all-delete-orphan
о детской коллекции.Может ли Hibernate удалять потерянные коллекции при обновлении отдельного объекта?
Я бы хотел, чтобы 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)
, этот метод просто отвечает за постоянные изменения, сделанные удаленными клиентскими приложениями.
вы имеете в виду, загрузить существующий объект, а затем 'слияния () 'он с отсоединенным экземпляром передал мне API? –
@ mattb: вы можете написать логику для объединения коллекции или даже просто заменить предыдущую коллекцию и установить новую, но убедитесь, что вы добавили тег в свой hbm. Это будет содержать простой запрос удаления sql для удаления полной коллекции перед сохранением новой. или другими способами, если вы добавите что-нибудь, этот sql-delete будет запущен каждый раз, а затем будет добавлена новая копия вашей коллекции. Это может решить вашу проблему при каждом обновлении коллекции вручную. –
Не уверен, что мне нравится это решение, так как это потребует изменения моего шаблона использования - например, ''. Надеюсь, это можно было бы зафиксировать только с помощью картографирования. –