Spring事务传播:can';使用同一交易进行创建和咨询操作时,无法获取@OneToMany关联实体

Spring事务传播:can';使用同一交易进行创建和咨询操作时,无法获取@OneToMany关联实体,spring,jpa,one-to-many,transactional,Spring,Jpa,One To Many,Transactional,我有以下问题:我正在开发一个spring引导应用程序,该应用程序提供REST服务,并使用一个使用spring数据jpa的关系(SQL)数据库 我有两种休息服务: -实体创建服务,用于创建子实体、父实体并将它们关联到同一事务中。此服务结束时,数据将提交到数据库中。 -一种实体咨询服务,可将母实体及其子实体收回 这两个服务使用@Transactional注释进行注释。在生产情况下,它工作得很好:我可以在一个事务(提交/结束)中创建一个父实体及其子实体,然后在另一个事务中获得它 问题是我何时想要创建集

我有以下问题:我正在开发一个spring引导应用程序,该应用程序提供REST服务,并使用一个使用spring数据jpa的关系(SQL)数据库

我有两种休息服务: -实体创建服务,用于创建子实体、父实体并将它们关联到同一事务中。此服务结束时,数据将提交到数据库中。 -一种实体咨询服务,可将母实体及其子实体收回

这两个服务使用@Transactional注释进行注释。在生产情况下,它工作得很好:我可以在一个事务(提交/结束)中创建一个父实体及其子实体,然后在另一个事务中获得它

问题是我何时想要创建集成测试。我的想法是使用@Transactional注释对每个测试进行注释,并在每个测试之后进行回滚。通过这种方式,我在每次测试之间保持数据库干净,并且我不需要再次生成模式或清理数据库中的所有记录

集成测试包括创建一个父级及其子级,然后在一个事务中读取所有内容(因为测试用@transaction注释)。读取以前在同一事务中创建的实体时,我可以获取父实体,但不会获取子实体(空值)。我不确定是否很好地理解了事务机制:我认为在测试方法上使用@Transactional,此测试调用的服务(用“@Transactional”注释)应该检测并使用测试方法打开的相同事务(传播配置为“必需”)。因此,由于事务使用相同的EntityManager,即使数据尚未提交到数据库,该事务也应该能够返回父实体与其先前在同一事务中创建的子实体之间的关系。奇怪的是,它检索的是父实体(尚未提交到数据库中),而不是其子实体。我对交易概念的理解正确吗?如果没有,有人能告诉我我错过了什么吗

另外,如果有人做了类似的事情,他能解释一下他是怎么做的吗


我的代码相当复杂。我首先想知道我是否很了解事务是如何管理的,是否有人做过类似的事情。如果确实需要,我可以发送有关我的实现的更多信息(事务管理器和实体管理器如何初始化、JPA实体、服务等)

在我的测试中绑定实体管理器,并在创建和读取之间从我的测试中调用其刷新方法,读取操作运行良好:我获取父实体及其子实体。但是数据在创建期间写入数据库,以便在读取操作期间读取。我不希望事务被提交,因为我需要在空数据库上进行测试。我的误解不在于交易机制,而在于实体管理器:它没有将创建的实体及其关系作为缓存保存

这篇文章帮助我。


最后,我考虑在每次测试之前调用一个SQL脚本来清空我的数据库。

在我的测试中绑定实体管理器,并从我的测试中调用它的flush方法,在创建和读取之间,读取操作运行良好:我得到父实体及其子实体。但是数据在创建期间写入数据库,以便在读取操作期间读取。我不希望事务被提交,因为我需要在空数据库上进行测试。我的误解不在于交易机制,而在于实体管理器:它没有将创建的实体及其关系作为缓存保存

这篇文章帮助我。

最后,我考虑在每次测试之前调用SQL脚本清空数据库