Spring Data JPA 存储库和 Spring Data JDBC 存储库共享一个数据库事务

Sharing one DB transaction by Spring Data JPA repository and Spring Data JDBC repository

首先我想说我真的很喜欢 Spring 数据抽象以及它如何帮助我在 Spring 应用程序的持久层中统一处理。

最近我注意到 Spring 数据 JDBC 出来了,所以我决定在新的 Spring Boot (2.3.1) 应用程序中使用它。在我的用例中,我有一个包含两类表的 数据库模式

  1. 用于存储应用程序(更复杂的)业务逻辑所使用的实体的表。我正在使用 Spring Data JPA(带有底层 Hibernate)来处理它们。
  2. 用于存储彼此之间没有太多关系的简单数据记录的表(例如来自外部系统的数据记录)。我决定为他们使用 Spring Data JDBC,因为一方面 JPA 是不必要的过度杀伤,而且我不想为简单查询而使用低级 SQL另一方面。

这就是故事,现在是我的问题:)。我正在使用 @Transactional(propagation = Propagation.REQUIRES_NEW) 实现具有事务方法的 Spring @Service bean。此服务方法在内部使用 Spring Data JPA 和 Spring Data JDBC 存储库来操作数据 (CRUD)。我没有在我的 JPA/JDBC 存储库中使用任何 @Transactional 注释(都是默认的)。我想知道我通过 JPA 存储库进行的数据库修改是否与我通过 JDBC 存储库进行的修改共享同一个数据库事务。我需要它是这样的。

我知道当我想在两种类型的存储库之间共享一个数据库事务时,要求两个存储库使用相同的数据库连接。因此,Spring Data JDBC 存储库需要使用与 Spring Data JPA 使用的 EntityManager (Hibernate Session) 相同的数据库连接。这可以通过某种方式实现,还是像这样开箱即用?你能帮我理解它在内部是如何工作的吗?非常感谢您!

TL;DR:开箱即用。

Spring 数据 JDBC 在后台使用 JdbcTemplate。实际上它是 NamedParameterJdbcTemplate 但这并不重要。

有了这些信息,很明显这个问题包含实际答案:

What transaction manager should I use for JBDC template When using JPA ?

总结一下:只要您只有一个 DataSource 并为该 JPA 创建一个 JpaTransactionManager,JDBC 就会共享事务。

并且使用单个 DataSource Spring 启动应该为您提供 TransactionManager