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

我有两个REST服务:-实体创建服务,它创建子实体,父实体并将它们关联到同一事务中。 该服务结束后,数据将提交到数据库中。 -实体咨询服务,可将其子实体带回其父实体

这两个服务都使用@Transactional注释进行注释。 在生产情况下,它运作良好:我可以在一个事务(已提交/结束)中创建一个带有其子级的父实体,然后在另一事务中获取它。

问题是当我想创建集成测试时。 我的想法是使用@Transactional批注对每个测试进行批注,并在每个测试之后进行回滚。 这样,我可以在每次测试之间保持数据库的清洁,而不必再次生成架构或清理数据库中的所有记录。

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

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

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

===============>>#1 票数:0

在测试中绑定Entity-manager并从测试中调用其flush方法,在创建和读取之间,读取操作运行良好:我获得了带有其子级的父实体。 但是,在创建过程中会将数据写入数据库,以便在读取操作期间读取数据库。 而且我不希望事务提交,因为我需要测试才能在空数据库上工作。 我的误区不是事务机制,而是实体管理器:它并没有将创建的实体及其之间的关系作为高速缓存保存...

这篇文章对我有帮助。 Spring JPA中的@Transactional注释问题

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

  ask by Francois Gergaud translate from so

未解决问题?本站智能推荐: