2009-10-20 2 views
0

У меня есть два класса: «Сервис и клиент» с ассоциацией «много-к-одному» от Сервиса до Клиента. Я хочу удалить клиента и любую службу, которая ссылается на него. Я использую JPA как ORM (с подменю Hibernate), прикрепленный к db PostgreSQL.Удаление объектов с помощью JPA с ограничениями внешнего ключа

Было бы здорово, если бы я мог определить ассоциацию таким образом, чтобы удаление Клиента каскадировалось на Службы, которые ссылаются на него. Но, возможно, я что-то недопонимаю, так как ассоциация определена с помощью @ManyToOne в сервисе, операции будут каскадом от Сервиса к Клиенту, но не наоборот?

Итак, без каскадного удаления я решил просто удалить все Службы, ссылающиеся на Клиента. Казалось, достаточно легко, за исключением того, что JPA/Hibernate хочет выполнить пакетное удаление и выполнить их в неправильном порядке! Мой код в основном запрашивает Сервисы, которые ссылаются на Клиент, вызывает сущность entityManager.remove() для каждого, а затем вызывает entityManager.remove() для Клиента. Но когда я его очищаю, я получаю исключение, что удаление из Клиента завершилось неудачно из-за ограничения внешнего ключа.

Нужно ли мне пытаться совершить удаление из Сервиса до удаления из Клиента? Я бы предпочел, чтобы мои транзакции не управлялись контейнерами, и это было бы болью в шее, чтобы заставить ее совершить.

Спасибо, Энди

ответ

1

вручную управлять стесненных отношения, вероятно, не очень хорошая идея, особенно если учесть, что это очень простой и стандартный тип объединения.

Почему вы не определяете one-to-many association в Customer с указанным каскадом? (В ссылке ваш Service класс заменит Order в примере.)

+0

Согласен, что объектная модель будет лучше, если направление было инвертировано. К сожалению, я наследую объектную модель от других и не могу оправдать ее модификацию по причинам обратной совместимости. – Andy

0

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

+1

Этот комментарий не помог. Я ищу технические решения, а не советы о том, как работать в моем домене. – Andy

+0

Когда я вижу плохой дизайн, я чувствую, что обязана указать на это. Я потратил слишком много времени, пытаясь исправить разбитые данные от людей, которые не думают о том, что они хотят делать. – HLGEM

+0

HLGEM прав. Только плохая конструкция позволяет удалить данные из хранилища сохраняемости. –

0

Я был неправ в порядке. Они были выполнены в правильном порядке, но проблема оказалась еще одним ограничением внешнего ключа, которое ранее было неизвестно и причиной отказа транзакции. Похоже, что первоначальный подход должен работать нормально, пока код учитывает все ограничения.

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