Каскадный режим гибернации: должен ли параметр null на родительском объекте удалять детей? - PullRequest
1 голос
/ 18 апреля 2010

Collection.clear () удаляет дочерние элементы при сбросе сессии.

А как насчет OneToOne? Установка в ноль не является правильным способом. Не существует метода clear () для OneToOne.

В Table_A есть столбец (не его PK!), На который OneToOne ссылается на Table_B.

Интересно, работает ли Hib в моем случае, как ожидалось?

Для моих параметров каскадирования установлено значение "all, delete orphan".

Таблица_A @OneToOne Таблица_B

Table_B @OneToMany Table_C

Теперь это выглядит как Таблица_А. getTable_B. getTable_C_Collection ()

Предположим, что в коллекции Table_C есть элементы.

Что я ожидаю от Hibernate: если я установлю для ссылки Table_B значение null, тогда

НЕОБХОДИМО УДАЛИТЬ все элементы коллекции Table_C.

Так не бывает. Они становятся ОРФАННЫМИ!

Ответы [ 3 ]

2 голосов
/ 19 апреля 2010

Вы пробовали "all-delete-orphan" вместо "all, delete-orphan"? Предполагается, что они работают одинаково, но в прошлом были проблемы, когда одно поведение отличалось от другого. Такие проблемы на самом деле являются ошибками, поэтому, если использование одного, а не другого ведет себя по-другому, обязательно откройте ошибку .

Возможно, вы захотите поиграть с настройкой inverse='true' в ваших отображениях Hibernate. Из документации и этого вопроса о переполнении стека он выглядит как обратный = true часто является ключом к получению каскадных удалений для правильной работы.

1 голос
/ 19 апреля 2010

Поддержка Hibernate для каскадных действий иногда бывает немного странной. Если вы обнаружите, что не можете получить желаемое поведение из коробки, вы можете реализовать перехватчик Hibernate или прослушиватель событий Hibernate . На самом деле это довольно легко сделать, и усилия того стоят (ваш основной код остается чистым).

В этом случае вы, вероятно, захотите реализовать PostUpdateEventListener или PreUpdateEventListener .

1 голос
/ 18 апреля 2010

Нет, удаление родителя приведет к удалению потомков, если у вас включен каскад.

Вам необходимо отправить DELETE SQL в базу данных, и простая установка ссылки на ноль не сделает этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...