Hibernate: Как сделать, чтобы Hibernate удалял записи из дочерней таблицы при удалении parent, если child связан с parent с много-к-одному? - PullRequest
5 голосов
/ 11 декабря 2008

Допустим, у меня есть две таблицы - «дочерняя» и «родительская» с отношением «многие к одному». Что мне нужно, так это удалить дочерние записи, если родительская запись удалена.

Это не проблема, если я связываю дочернюю таблицу с родителем, создавая связь один-ко-многим в parent.hbm и установив cascade = "all-delete-orphan".

Проблема в том, что я не хочу отношения один-ко-многим на родительской стороне, поэтому я создал много-к-одному на дочерней стороне. Причина в том, что дочерняя таблица довольно большая, и я не хочу извлекать сотни записей каждый раз, когда использую parent. Итак, моя конфигурация выглядит так:

child.hbm:

<many-to-one name="parent" class="com.example.Parent" column="parentid"/>

, в то время как parent.hbm не связан с child.

Вопрос заключается в следующем: Как заставить Hibernate удалять записи из дочерней таблицы при удалении родителя, если дочерний элемент связан с родителем с много-к-одному?

Спасибо.

1 Ответ

5 голосов
/ 11 декабря 2008

Пара вариантов:

  • добавьте один-ко-многим к родителю с помощью каскадного удаления, но уменьшите потерю производительности с помощью отложенной загрузки.

  • используйте Hibernate Interceptor (или аспект в среде AOP) для обнаружения удалений родительских записей и удаления дочерних элементов.

Лично я предпочел бы первый вариант, поскольку он позволяет вашей модели данных более точно отражать реальные отношения в ваших данных.

Редактировать: есть третий вариант, но он не приятен - используйте триггер базы данных и очистите кэш Hibernate (или используйте сеанс без кэширования).

...