传递给持久化的 Hibernate 分离实体

Hibernate deatched entity passed to persist

我在我的一个集成测试中抛出了这个 PersistanceObjectException。

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

我已经确认我尝试保留的实体不存在,当我尝试保留它时。但是,只有当先前的测试(在不同的 class 中)仍然存在时,才会发生错误。

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

持久化操作是一个简单的entityManager.persist(实体)。没有什么复杂或花哨的。

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

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

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

所以,当你将它传递给 persist 时,确保实体 id 为 null。