传递给持久化的休眠分离实体

Posted

技术标签:

【中文标题】传递给持久化的休眠分离实体【英文标题】:Hibernate deatched entity passed to persist 【发布时间】:2015-01-23 17:47:35 【问题描述】:

在我的一项集成测试中,我遇到了这个 PersistanceObjectException 异常。

它自己运行的测试在自己运行时运行良好,但不是作为测试套件的一部分。所以我将 DirtiesContext 添加到所有集成测试中,但是由于某种原因这没有任何影响。

当我尝试持久化时,我已确认我尝试持久化的实体不存在。但是,仅当先前的测试(在不同的类中)仍然存在相同的情况时才会发生错误。

如果这是实体从一个案例持续到下一个案例的情况,为什么 DirtiesContext 不能解决这个问题,我检查实体是否已经持续存在是正确的。

persist 操作是一个简单的 entityManager.persist(entity)。没有什么复杂或花哨的。

有什么想法吗?我真的被这个难住了。

【问题讨论】:

【参考方案1】:

这取决于您如何设置集成测试数据库。 DirtyContext 设置只会重新创建 Spring 应用程序上下文,因此除非您有一个 Spring 上下文生命周期感知内存数据库,否则数据库可能不会在测试运行之间得到清理。

在您的情况下,您提供的实体只是设置了 id。如果您不提供新创建的实体,则持久化操作将失败。

因此,当您将实体 id 传递给持久化时,请确保它为空。

【讨论】:

你是对的,被持久化的实体确实设置了它的 id,但是如果我尝试使用 DAO 获取该实体,我会返回 null。这让我感到困惑,只有在断点处停下来才能看到创建的实体在被持久化之前有一个 id,但我之前所做的每一件事都表明该实体不存在。 尝试使用merge而不是persist,然后调用flush()。 坚持是正确的选择。我已经缩小了这个问题的范围,可能需要问一个不同的问题。 DirtiesContext 无法正常工作。我有一个特定的 bean 填充了一个列表,在第二次测试开始时,这个 bean 的列表中填充了上次运行的数据。由于此列表包含要保留的新实体,因此在第二次测试结束时,每个实体将有两个副本,因此会导致错误。

以上是关于传递给持久化的休眠分离实体的主要内容,如果未能解决你的问题,请参考以下文章

org.hibernate.PersistentObjectException:传递给持久化的分离实体:多对一单向

Hibernate - 已经持久化的孩子的“分离实体传递给持久化”错误

PersistenceException:传递给持久化的分离实体

有没有办法将分离的对象传递给 JPA 持久化? (分离的实体传递给坚持)

传递给持久化的分离实体:JPA 继承

Hibernate:将现有子实体添加到具有 OneToMany 双向关系的新实体并将其持久化(“分离的实体传递给持久化”)