2012-05-08 2 views
5

У меня есть приложение, которое загружает объекты через спящий режим, а затем передает эти объекты на другой уровень как отдельные объекты. Любые изменения этих объектов отправляются обратно на уровень гибернации, где я вызываю saveOrUpdate() на эти объекты.Будет ли метод Hibernate saveOrUpdate удалять детей?

Будет ли спящий режим удалять дочерние объекты отношения «один ко многим», содержащиеся в коллекции, в объектах, которые передаются в saveOrUpdate(), если я просто удалю дочерний объект из коллекции до вызова saveOrUpdate()?

Если нет, то как это обычно выполняется в приложении спящего режима, которое использует отдельные объекты?

ответ

5

Будет зимовать удалить один-ко-многим дочерних объектов отношений, содержащихся в коллекции в объектах, которые передаются в saveOrUpdate(), если я просто удалить дочерний объект из коллекции перед вызовом saveOrUpdate()?

Нет, не по умолчанию. Такие дочерние объекты в этом контексте называются «сиротами», предполагая, что какой-либо другой объект также не имеет ссылки на них.

Это обсуждается в документации, 11.11. Transitive persistence:

особый стиль каскада, delete-orphan, относится только к один-ко-многим ассоциаций, а также указывает на то, что delete() операция должна быть применена к любому объекту ребенка, что удаляется из ассоциации. Используя аннотации, нет эквивалента CascadeType.DELETE-ORPHAN. Вместо этого вы можете использовать атрибут orphanRemoval, как показано в примере 11.4, «@OneToMany с orphanRemoval». Если объект удален из коллекции @OneToMany или связанный с ним объект разыменован из ассоциации @OneToOne, этот связанный объект может быть помечен для удаления, если для orphanRemoval установлено значение true.

+0

Это имеет смысл. Однако, когда я устанавливаю CascadeType.ALL, orphanRemoval = true в коллекции, дочерний объект все еще не удаляется. Может ли это быть связано с тем, что я использую аннотацию JoinColumn в сочетании с аннотацией OneToMany? – Tom

+0

@Tom: Вероятно, нет, нет, '@ JoinColumn' просто используется для переопределения имени столбца объединения по умолчанию. Кажется, что Hibernate не думает, что это сирота. Вы уверены, что какой-либо другой объект не имеет ссылки на этого ребенка? – skaffman

+0

Это определенно не относится к другому объекту. Однако базовое отношение db фактически является ManyToMany, и я использую OneToMany с JoinColumn, чтобы упростить модель. Может быть, это его бросает? В противном случае я также заметил, что некоторые дочерние сущности ребенка содержат отношения ManyToOne, которые не могут иметь установленный на них атрибут orphanRemoval. Возможно, это мешает исключить родителя. – Tom

0

По умолчанию это не так. Для этого вы можете использовать @Cascade (CascadeType.DELETE_ORPHANS).

Смежные вопросы