当前位置: 首页 > 知识库问答 >
问题:

Spring事务传播:使用同一事务进行创建和咨询操作时,无法获取@OneTomany相关实体

巫英纵
2023-03-14

我有以下问题:我正在处理一个spring-boot应用程序,它提供REST服务,并使用Spring-Data-JPA使用关系(SQL)数据库。

我有两个REST服务:一个实体创建服务,它创建子实体和父实体,并将它们关联在同一个事务中。当此服务结束时,数据被提交到数据库中。-实体咨询服务,将父母实体及其子女带回

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

问题是我什么时候想要创建集成测试。我的想法是用@transactional注释来注释每个测试,并在每个测试之后进行回滚。这样我就可以在每次测试之间保持数据库的清洁,而且我不会再次生成模式或清除数据库中的所有记录。

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

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

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

共有1个答案

孙玮
2023-03-14

在我的测试中绑定实体管理器,并从我的测试中调用它的flush方法,在创建和读取之间,读取操作工作得很好:我获得父实体及其子实体。但在创建过程中将数据写入数据库,以便稍后在读取操作中读取数据。并且我不希望事务被提交,因为我需要我的测试在一个空数据库上工作。我的误解与其说是关于事务机制,不如说是关于实体管理器:它没有将创建的实体和它们之间的关系作为缓存。

这个帖子帮我。Spring JPA中的@Transactional注释问题

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

 类似资料:
  • 我试图理解Spring事务概念。如下所示,我必须将数据插入两个不同的数据库(iSeries和DB2),但我们的iSeries版本不支持两阶段提交。要求是,只有当两个插入都成功时才应该提交事务,否则应该回滚。 如果我根据需要使用传播或REQUIRES\u NEW,我会得到错误“非法尝试使用现有的两阶段资源提交一阶段资源”。 但是如果我使用NOT_SUPPORTED或支持,它工作正常(即如果其中一个插

  • 我使用的是Spring-Kafka2.2.2.release(org.apache.kafka:kafka-clients:jar:2.0.1)和spring-boot(2.1.1)。我无法执行事务,因为我的侦听器无法获得分配的分区。我只为一个消费者创建了建议的配置。我正在尝试配置一个事务性侦听器容器,并且只处理一次 我使用事务管理器配置了生产者和使用者,生产者使用事务id,使用者使用isolat

  • 本文向大家介绍浅谈Spring事务传播行为实战,包括了浅谈Spring事务传播行为实战的使用技巧和注意事项,需要的朋友参考一下 Spring框架提供了事务管理的标准实现,且可以通过注解或者XML文件的方式声明和配置事务。 通过异步事件的方式解耦服务调用,可以提高程序的响应速度,并且避免因为事务传播行为而导致的事务问题。 本文以一个电商平台包裹出库的业务为实际背景,通过异步事件与线程池的方式解耦嵌套

  • 所称的刀是: 我希望服务类中的方法在事务中运行,并在方法出现异常时回滚所有内容。但这不是在事务中运行的。 如果我将添加到DAO方法中,那么它看起来就像是在单独的事务中运行的。这是正确的吗?

  • 根据我的理解,在Spring Boot中不能代理私有方法。因此,@Transactional不能放在私有方法上。这让我想知道,如果中间有一个或多个私有方法,事务会传播吗?例如,以下代码块等效吗 } 上述是否等于: 请注意,第二个代码在两者之间添加了一个私有方法。还有刀。另一个类中的save()方法如下所示:

  • 在下面的文章中说, 在此处输入链接描述 需要传播–支持当前交易;如果不存在,请创建一个新的。 下面是一个产品代码,然后是两个表的产品详细信息。 我的问题是什么时候会发生这种行为?我的意思是,当前交易怎么会结束?是在保存还是更新之后? 如果我们使用PROPAGATION_REQUIRED假设当前事务在插入产品后结束。然后一个新的事务来了,但是如果插入产品数量时出现任何故障,它只会回滚数量而不是输入的