我有一个带有两个类的hibernate模型,比方说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]
在删除期间看到的代码中的Diggin已经完成了可空性检查,并且因为A首先被删除,所以删除B无法进行空检查。它认为它的引用是“null”,即使我传入的B对象设置为非null。看起来它在内部会话状态中进行了一些查找,并找到了已删除的A实例。
任何人都知道如何解决这个问题?如果可能的话,我宁愿不依赖删除的顺序,除非在B之前删除A由于某些我没有看到的根本错误。
我也不完全确定删除时需要进行空检查的原因。
答案 0 :(得分:1)
我认为在删除“父级”之前必须删除所有“子级”。我意识到你不想受到删除顺序的摆布,但我认为没有其他方法可以解决这个问题。
只是一个想法,但看看在删除的每一步实际到达数据库的内容。如果Hibernate设置为使用表的所有列创建DELETE命令,包括链接到A的外键,那么如果DELETE命令正在查找A键的NULL值,则它将找不到任何内容。
答案 1 :(得分:1)
删除A会将B中对它的引用设置为null,这是架构禁止的。更改删除顺序的另一种方法是在B中添加反向一对多集合,并进行级联删除。只需删除A即可。