74.7 使用两个EntityManagers

即使默认的EntityManagerFactory工作的很好,你也需要定义一个新的EntityManagerFactory,因为一旦出现第二个该类型的bean,默认的将会被关闭。为了轻松的实现该操作,你可以使用Spring Boot提供的EntityManagerBuilder,或者如果你喜欢的话可以直接使用来自Spring ORM的LocalContainerEntityManagerFactoryBean

示例:

  1. // add two data sources configured as above
  2. @Bean
  3. public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory(
  4. EntityManagerFactoryBuilder builder) {
  5. return builder
  6. .dataSource(customerDataSource())
  7. .packages(Customer.class)
  8. .persistenceUnit("customers")
  9. .build();
  10. }
  11. @Bean
  12. public LocalContainerEntityManagerFactoryBean orderEntityManagerFactory(
  13. EntityManagerFactoryBuilder builder) {
  14. return builder
  15. .dataSource(orderDataSource())
  16. .packages(Order.class)
  17. .persistenceUnit("orders")
  18. .build();
  19. }

上面的配置靠自己基本可以运行,想要完成作品你还需要为两个EntityManagers配置TransactionManagers。其中的一个会被Spring Boot默认的JpaTransactionManager获取,如果你将它标记为@Primary。另一个需要显式注入到一个新实例。或你可以使用一个JTA事物管理器生成它两个。

如果使用Spring Data,你需要相应地需要配置@EnableJpaRepositories

  1. @Configuration
  2. @EnableJpaRepositories(basePackageClasses = Customer.class,
  3. entityManagerFactoryRef = "customerEntityManagerFactory")
  4. public class CustomerConfiguration {
  5. ...
  6. }
  7. @Configuration
  8. @EnableJpaRepositories(basePackageClasses = Order.class,
  9. entityManagerFactoryRef = "orderEntityManagerFactory")
  10. public class OrderConfiguration {
  11. ...
  12. }