使用带有分离实体的Spring Data / JPA / Hibernate测试保存调用

时间:2014-09-10 11:56:49

标签: java spring hibernate jpa spring-data

我有一个Java应用程序,它使用Spring Data(使用JPA和Hibernate)通过服务和存储库层与数据库进行交互。大多数工作正常,但我在测试组合对象的保存调用时遇到问题:

涉及三个对象:

  • 对象A我从数据库中获取
  • 对象B我在测试中创建了一个新实例
  • object C我想保存到与对象A具有多对一关系的数据库以及与对象B的一对一关系(以及与其关联的实例)

(Cascade设置为合并并保留)

现在,当尝试使用对象C的服务来保存它时,我得到一个分离的实体异常。将@Transactional置于测试方法之上时,我无法检查数据库的状态,因为事务仍处于打开状态。 (在@Transactional的单独方法中检索和创建对象+保存调用根本没有做任何事情。尝试抓取实体管理器并刷新它也无济于事。)

我确信这可能是一个常见的问题(或者只是我方面的误解),但我没有找到任何解决方案,并且不胜感激。

正在使用的版本:

  • Spring 4.0.5
  • JPA 2.1
  • Hibernate 4.3.5

2 个答案:

答案 0 :(得分:0)

您必须先保留对象B,或者将cascade属性添加到关系注释中,例如

@OneToMany(cascade = CascadeType.ALL, mappedBy = "field")

这将通过关系级联所有操作。

答案 1 :(得分:0)

更新到Spring 4.1.0帮我解决了这个问题。在Spring 4.1.0中是一个新的类TestTransaction,可以在事务期间提交(在我的情况下我需要@Transactional以避免分离的实体),因此您可以检查数据库的状态。

好像你必须关闭实际提交的连接并再次重新打开以检查数据库。我使用了这样的提交调用:

private void commit() {
    TestTransaction.flagForCommit();
    TestTransaction.end();
    TestTransaction.start();
}

如果您知道更容易/更好用,请告诉我。但这对我来说很有把握。