Java 与hibernate合并导致脏对象出错

Java 与hibernate合并导致脏对象出错,java,hibernate,spring,Java,Hibernate,Spring,我在应用程序中使用了Hibernate和Spring。我一直在使用分离的对象,并在需要调用数据库时重新连接它们。我正在使用hibernate模板为我管理连接 我的数据结构如下: classA: <one-to-many name="classB" inverse="true" cascade="all,delete-orphan" lazy="true"> classB: <one-to-many name="classC" inverse="true" cas

我在应用程序中使用了Hibernate和Spring。我一直在使用分离的对象,并在需要调用数据库时重新连接它们。我正在使用hibernate模板为我管理连接

我的数据结构如下:

classA: 
   <one-to-many name="classB" inverse="true" cascade="all,delete-orphan" lazy="true">

classB:
   <one-to-many name="classC" inverse="true" cascade="all,delete-orphan" lazy="false" fetch="subselect">
我得到的错误是:

[11/10/08 12:08:39:126 EST] 00000024 SystemOut     O 2008-11-10 12:08:38,876  -  - ca.thedominion.cfa.persistence.hibernate.ClassADAOImpl  :updateClassA Technical Exception occurred: 
org.springframework.dao.InvalidDataAccessApiUsageException: deleted object would be re-saved by cascade (remove deleted object from associations): [ca...classC#715590]; nested exception is org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [ca...classC#715590]
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:639)
    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
    at org.springframework.orm.hibernate3.HibernateTemplate.merge(HibernateTemplate.java:820)

有人能解释一下为什么会产生错误吗?据我所知,merge应该确定树中哪些对象(如果有)发生了更改,并更新/删除/插入这些对象,而不是尝试删除和重新插入任何其他对象。但这似乎是试图删除classC类型的所有元素并重新插入它们。

显然,您删除了一个classC,但它仍保留在其中一个集合中。现在Hibernate不知道该怎么做:您删除了它,但集合有cascade=“all”(即包括save),您将要保存集合(包括已删除的对象)

您应该从集合中删除classC对象,而不是直接删除它,或者同时执行这两项操作(从集合中删除和删除)

[11/10/08 12:08:39:126 EST] 00000024 SystemOut     O 2008-11-10 12:08:38,876  -  - ca.thedominion.cfa.persistence.hibernate.ClassADAOImpl  :updateClassA Technical Exception occurred: 
org.springframework.dao.InvalidDataAccessApiUsageException: deleted object would be re-saved by cascade (remove deleted object from associations): [ca...classC#715590]; nested exception is org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [ca...classC#715590]
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:639)
    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
    at org.springframework.orm.hibernate3.HibernateTemplate.merge(HibernateTemplate.java:820)