Может ли Hibernate удалять потерянные коллекции при обновлении отключенного объекта?

Я знаю, что удаление осиротевших дочерних объектов - это общий вопрос в SO и общая проблема для людей, плохо знакомых с Hibernate, и что довольно стандартный ответ - убедиться, что у вас есть вариант cascade = all, delete-orphan или cascade = all-delete-orphan в дочерней коллекции.

I ' Я хотел бы иметь возможность, чтобы 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 видит этот экземпляр объекта - я не подключаю и не объединяю объект с сеансом каким-либо другим способом. . Я полагаюсь на то, что клиент передает объекты, идентификаторы которых соответствуют реальным объектам в базе данных. Например, логика в моем методе службы API выглядит примерно так:

String jsonString = request.getParameter(...);
Parent parent = deserialize(jsonString);
session.update(parent);

Может ли Hibernate обнаруживать потерянные дочерние коллекции в отсоединенных родительских объектах при передаче в session.update (parent) ? Или я каким-то образом неправильно использую отсоединенный объект?

Я надеялся, что смогу избежать каких-либо сложных взаимодействий с Hibernate для сохранения изменений в отсоединенном экземпляре. Мой метод API не нуждается в дальнейшем изменении отсоединенного объекта после вызова сеанса . update (parent) , этот метод просто отвечает за сохранение изменений, сделанных удаленными клиентскими приложениями.

16
задан matt b 21 October 2010 в 13:57
поделиться