我有一个Java应用程序,它使用Spring Data(使用JPA和Hibernate)通过服务和存储库层与数据库进行交互。大多数工作正常,但我在测试组合对象的保存调用时遇到问题:
涉及三个对象:
(Cascade设置为合并并保留)
现在,当尝试使用对象C的服务来保存它时,我得到一个分离的实体异常。将@Transactional
置于测试方法之上时,我无法检查数据库的状态,因为事务仍处于打开状态。 (在@Transactional
的单独方法中检索和创建对象+保存调用根本没有做任何事情。尝试抓取实体管理器并刷新它也无济于事。)
我确信这可能是一个常见的问题(或者只是我方面的误解),但我没有找到任何解决方案,并且不胜感激。
正在使用的版本:
答案 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();
}
如果您知道更容易/更好用,请告诉我。但这对我来说很有把握。