java - 与 hibernate 合并导致脏对象错误

标签 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" 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 的元素并重新插入它们。

最佳答案

显然,您删除了 classC 之一,但它仍然保留在其中一个集合中。现在Hibernate很困惑该怎么做:你删除了它,但集合有cascade =“all”(包括保存,即),并且你要保存集合(包括删除的对象)。

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

关于java - 与 hibernate 合并导致脏对象错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/278808/

相关文章:

java - hibernate 查询,用于搜索部分字符串

java - JPA 2.0、hibernate 3.5、jars 和 persistence.xml 位置

java - 更新依赖于其他实体状态的@Entity 字段的正确方法

java - GridLayout java居中对齐

java - 网 bean : how to resize the UI Window to screen Size

java - 代码生成时找不到 Hibernate MultiMap

java - Spring DAO 和不可变对象(immutable对象)

java - 单元测试时如何设置全局环境变量

java - 创建jar时选择主类

java - 如何在JavaFX中获取TableView的文件图标?