【问题标题】:Test save call using Spring Data/JPA/Hibernate with detached entity使用带有分离实体的 Spring Data/JPA/Hibernate 测试保存调用
【发布时间】:2014-09-10 11:56:49
【问题描述】:

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

涉及三个对象:

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

(级联设置为合并和持久化)

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

我确信这可能是一个常见问题(或者只是我的误解),但我还没有找到任何解决方案,希望得到任何建议。

正在使用的版本:

  • 春季 4.0.5
  • JPA 2.1
  • 休眠 4.3.5

【问题讨论】:

    标签: java spring hibernate jpa spring-data


    【解决方案1】:

    你必须先持久化对象 B 或者将级联属性添加到关系注解中,例如

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

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

    【讨论】:

    • 感谢您的回复,但级联类型已设置为 MERGE 和 PERSIST
    【解决方案2】:

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

    您似乎必须关闭连接才能实际提交并再次重新打开它以检查数据库。我使用了这样的提交调用:

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

    如果您知道更简单/更好的用法,请告诉我。但这对我有用。

    【讨论】:

      猜你喜欢
      • 2015-09-11
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 2023-01-27
      • 2018-01-11
      • 2019-09-30
      • 2014-11-21
      • 1970-01-01
      相关资源
      最近更新 更多