我在我的应用程序中使用 Hibernate 和 Spring。我一直在使用分离的对象,并在需要调用数据库时重新附加它们。我正在使用休眠模板来为我管理连接。
我的数据结构如下:
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">
当我进行以下调用时,可能 classB 或 classC 中的某些项目已更改,我收到错误消息:
classA a = (classA)hibernateTemplate.merge(newClassA);
我得到的错误是:
[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)
有人可以向我解释为什么这会产生错误吗?据我了解,合并应确定树中的哪些对象(如果有)已更改,并更新/删除/插入这些对象,而不是尝试删除和重新插入任何其他对象。但这似乎是试图删除所有 classC 类型的元素并重新插入它们。