Удаление связанных объектов в спящем режиме - PullRequest
0 голосов
/ 30 октября 2009

У меня есть модель гибернации с двумя классами, скажем, A и B. B имеет ссылку «многие к одному» на A.

Я запрашиваю один объект A и один объект B. Они отделены от сеанса и обрабатываются где-то / используются в другом месте. Свойство B.A - это ленивый прокси. Некоторое время спустя A и B оба должны быть удалены. Я создаю новый сеанс и вызываю .delete(A) и .delete(B).

Удаление A в порядке, но затем удаление B вызывает следующее исключение,

Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: com.xxx.hibernate.objects.B.A
    at org.hibernate.engine.Nullability.checkNullability(Nullability.java:95) [hibernate3.jar:na]
    at org.hibernate.event.def.DefaultDeleteEventListener.deleteEntity(DefaultDeleteEventListener.java:272) [hibernate3.jar:na]
    at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:163) [hibernate3.jar:na]
    at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:74) [hibernate3.jar:na]
    at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:794) [hibernate3.jar:na]
    at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:772) [hibernate3.jar:na]

Копирование в коде выглядит так, что во время удаления выполняется проверка на обнуляемость, и, поскольку A был удален первым, удаление B не проходит проверку на нулевое значение. Он думает, что ссылка является «нулевой», даже если объект B, который я передаю, установлен в значение «не ноль». Похоже, что он выполняет поиск во внутреннем состоянии сеанса и находит удаленный экземпляр А.

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

Я также не совсем уверен, почему для удаления требуется нулевая проверка.

Ответы [ 2 ]

1 голос
/ 30 октября 2009

Удаление A установит ссылку на него в B на ноль, что запрещено схемой. Альтернативой изменению порядка удаления может быть добавление обратной коллекции «один ко многим» в B с каскадным удалением. Только удаление A было бы, чем необходимо.

1 голос
/ 30 октября 2009

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

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

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