У меня есть модель гибернации с двумя классами, скажем, 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 не является принципиально неправильным по какой-то причине, которую я не вижу.
Я также не совсем уверен, почему для удаления требуется нулевая проверка.