2009-10-30 127 views
0

我有两个班休眠模式,假设A和B B有一个多到一个参考A.删除休眠相关对象

我查询一个A和一个B对象。这些从会话中分离出来,并在某处/其他地方处理。 B.A属性是一个懒惰的代理。过了一会儿,A和B都需要被删除。我创建了一个新的会话并呼叫.delete(A).delete(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未通过空检查。它认为它是一个引用是“null”,即使我传入的B对象被设置为非null。看起来像在内部会话状态中进行了一些查找并找到了删除的A实例。

任何人都知道我该如何解决这个问题?如果可能的话,我宁愿不依赖于删除的顺序,除非在某种原因我没有看到B之前删除A基本上是错误的。

我也不完全确定为什么删除时需要空检查。

回答

1

我想你必须在删除“父母”之前删除所有的“子女”。我意识到你不想受到删除顺序的控制,但我认为没有其他解决办法。

只是一个想法,但看看在删除的每一步中实际到达数据库的内容。如果Hibernate设置为使用表的所有列(包括链接到A的外键)创建DELETE命令,则DELETE命令在查找A键的NULL值时不会查找任何内容。

+0

好主意,但不幸的是它只是做一个删除的id和versionNo这是我所期望的。 – 2009-10-30 12:05:32

+0

强迫得出这个顺序很重要,我猜hibernate试图在删除命中DB之前强制执行fk约束。 – 2009-10-30 13:58:04

1

删除A会将其在B中的引用设置为null,这被模式禁止。另一种更改删除顺序的方法是在B中添加一个反向的一对多集合,并进行级联删除。只需要删除A即可。