具有自动配置的 Spring Data JPA 应用程序的多个数据库

Posted

技术标签:

【中文标题】具有自动配置的 Spring Data JPA 应用程序的多个数据库【英文标题】:Multiple database for Spring Data JPA Application with autoconfigurations 【发布时间】:2015-12-04 21:02:48 【问题描述】:

我在 Spring Boot 上使用 Spring Data JPA,这给了我很好的自动配置,所以我不需要为每个实体配置 EntityManager 和 DataSource。

但是,我的应用可能需要连接到两个不同的数据库。所以我的应用程序上的一些实体需要映射到数据库,而其他实体需要映射到不同的数据库

我已经探索了这个 repo Link

发现repo为每个实体配置了每个EntityManager和TransactionManager。如果我的应用有很多实体,这可能会非常耗时。

是否有可能我仍然依赖 Spring Boot autoconfig for Spring Data JPA 并且仍然使用两个不同的数据库?

【问题讨论】:

【参考方案1】:

每个数据源只需要一个配置,而不是每个实体(每个数据源可以有多个实体)。例如,假设您正在现有数据库之上开发一个系统,其中产品目录在一个数据库中,库存信息在另一个数据库中,订单信息需要进入一个完全不同的数据库。此外,您的(新)应用程序的客户信息需要存储在一个全新的数据库中,因为其他数据库的所有者不允许您接触他们的。因此,总的来说,您需要处理四个数据库。

您将需要四个数据源配置,一个用于您需要处理的四个数据库中的每一个。每个配置都必须定义:

    SQL DataSource 提供有关连接数据库的信息; 一个使用DataSourceEntityManagerFactoryEntityManager 可以使用的TransactionManager 实现;和 对 Java 包的引用,EntityManager 可以在其中找到映射到 DataSource 的实体类。

如果数据库操作一次只针对一个数据库执行,您可以在每个配置中使用JpaTransactionManagers(这意味着您将需要四个JpaTransactionManager 声明)。但是,如果数据库操作可能跨越多个数据库,您可以声明一个 JtaTransactionManager 或声明四个 JpaTransactionManagers(每个 DataSources 一个)并将它们包装在一个 ChainedTransactionManager 中(使总共五个事务管理器声明)。

由于您的实体类将绑定到特定的数据源,因此您需要使用不同的 Java 包来隔离它们。例如,您可以有org.example.model.catalogorg.example.model.inventoryorg.example.model.orderorg.example.model.customer 等。

【讨论】:

如何将这些 EntityManagerFactory 链接到 Spring Data JPA 中的每个存储库接口? LocalContainerEntityManagerFactoryBeanpackagesToScan 属性设置为实体管理器应查找存储库接口的值(例如,org.example.data.customer)。【参考方案2】:

不,this is explained in the documentation。

sample project 向您展示了如何进行配置。它对每个持久性单元使用包扫描。

【讨论】:

以上是关于具有自动配置的 Spring Data JPA 应用程序的多个数据库的主要内容,如果未能解决你的问题,请参考以下文章

Spring data jpa 不适用于自动配置的 entityManagerFactory

如何使用基于类的配置设置具有不同基础包、transactionManagerRef 的多个 Spring Data JPA?

具有多租户休眠的 Spring-Data JPA

使用 Spring Boot 自动装配具有 jpa 和非 jpa 特征的多个数据源

学习Spring-Data-Jpa(二十一)---DataSource与JPA属性配置

使用spring-boot-starter-data-jpa 怎么配置使运行时输出SQL语句