2015-09-09 68 views
2

我使用Spring数据JPA在春季启动给我很好的自动配置,所以我不需要为每个实体配置EntityManager和数据源。多个数据库的春天数据JPA应用程序与自动配置

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

我已经探讨过这个回购 Link

,结果发现,回购配置每个EntityManager和TransactionManager为每个实体。如果我的应用程序有很多实体,这可能非常耗时。

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

回答

4

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

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

  1. SQL DataSource提供有关连接到数据库的信息;
  2. 使用DataSourceEntityManagerFactory;
  3. A TransactionManager执行表示EntityManager可以使用;和
  4. 引用Java程序包,其中EntityManager可以找到映射到DataSource的实体类。

如果数据库操作是这样的,他们是在同一时间对只有一个数据库中执行,则可以使用JpaTransactionManager s的每个配置(这意味着你将需要四个JpaTransactionManager声明)。但是,如果数据库操作可能跨越多个数据库,则可以声明一个JtaTransactionManager或声明四个JpaTransactionManager(每个DataSource都一个)并将它们包装在一个ChainedTransactionManager(总共创建五个事务管理器声明) 。

由于您的实体类将被绑定到特定的数据源,因此您将需要使用不同的Java包对它们进行分隔。您可以例如org.example.model.catalog,org.example.model.inventory, org.example.model.order, org.example.model.customer

+0

如何将这些'EntityManagerFactory'从Spring Data JPA链接到每个存储库接口? – IllSc

+0

将LocalContainerEntityManagerFactoryBean的'packagesToScan'属性设置为实体管理器应该查找存储库接口的值(例如,'org.example.data.customer')。 – manish