Springboot+jpa異なるデータベースのマルチデータソース構成を実現


くだらないことは言わないで、配置を直接見ます!
1、application.yml
#       
#primary
spring:
  primary:
    datasource:
      url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/dico_dev?autoReconnect=true&autoReconnectForPools=true&useUnicode=true&characterEncoding=UTF-8&useSSL=true
      username: root
      password: xxxx
      driver-class-name: com.mysql.jdbc.Driver

#secondary
  secondary:
    datasource:
      url: jdbc:sqlserver://xxx.xxx.xxxx.xxx:1433;databasename=LZMISportal
      username: root
      password: xxxx
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver

  jpa:
    hibernate:
      primary-dialect: org.hibernate.dialect.MySQL5Dialect
      secondary-dialect: org.hibernate.dialect.SQLServer2008Dialect
    open-in-view: true
    show-sql: true

プロファイルは、上記のように、2つのデータベースのリンクとデータベースに対応する方言をそれぞれ定義します.
2、データソースの構成
@Configuration
public class DataSourceConfig {


    @Bean(name = "primaryDataSource")
    @Primary
    @Qualifier("primaryDataSource")
    @ConfigurationProperties(prefix = "spring.primary.datasource")
    public DataSource primaryDatasource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryDataSource")
    @Qualifier("secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.secondary.datasource")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

}

 
コード解析:1、2つのデータソースはそれぞれymlファイルに配置されたデータソースに対応する2、@Bean注記を使用して対応方法を後で使用するために配布する
3、異なるデータソースの役割ドメインを定義する
マルチデータソース構成1)
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactoryPrimary",//       entityManagerFactory
        transactionManagerRef = "transactionManagerPrimary", //          transactionManager
        basePackages = {"xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx"}//         
)
public class PrimaryConfig {

    @Autowired
    private JpaProperties jpaProperties;

    @Autowired
    @Qualifier("primaryDataSource")
    private DataSource primaryDataSource;//            
    
    @Value("${spring.jpa.hibernate.primary-dialect}")
    private String primaryDialect;//           


    /**
     *
     * @param builder
     * @return
     */
    @Bean(name = "entityManagerFactoryPrimary")
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {

        return builder
                //     
                .dataSource(primaryDataSource)
                //       
                .properties(getVendorProperties(primaryDataSource))
                //         .       @Entity     
                .packages("xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx")
                // Spring  EntityManagerFactory   Repository  .   EntityManagerFactory  ,
                // Repository        EntityManager  ,   EntityManager             
                .persistenceUnit("primaryPersistenceUnit")
                .build();

    }

    private Map getVendorProperties(DataSource dataSource) {
        Map map = new HashMap<>();
        map.put("hibernate.dialect",primaryDialect);//           
        jpaProperties.setProperties(map);
        return jpaProperties.getHibernateProperties(dataSource);
    }

    /**
     *        
     *
     * @param builder
     * @return
     */
    @Bean(name = "transactionManagerPrimary")
    @Primary
    PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
    }


}

 
マルチデータソース構成2)
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef="entityManagerFactorySecondary",
        transactionManagerRef="transactionManagerSecondary",
        basePackages= { "xxx.xxx.xxx.xxx" })
public class SecondaryConfig {

    @Autowired
    private JpaProperties jpaProperties;

    @Autowired
    @Qualifier("secondaryDataSource")
    private DataSource secondaryDataSource;
    
    @Value("${spring.jpa.hibernate.secondary-dialect}")
    private String secondaryDialect;



    @Bean(name = "entityManagerSecondary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactorySecondary(builder).getObject().createEntityManager();
    }

    @Bean(name = "entityManagerFactorySecondary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(secondaryDataSource)
                .properties(getVendorProperties(secondaryDataSource))
                .packages("xxx.xxx.xxx.xxx")
                .persistenceUnit("secondaryPersistenceUnit")
                .build();
    }

    private Map getVendorProperties(DataSource dataSource) {
        Map map = new HashMap<>();
        map.put("hibernate.dialect",secondaryDialect);
        jpaProperties.setProperties(map);
        return jpaProperties.getHibernateProperties(dataSource);
    }

    @Bean(name = "transactionManagerSecondary")
    PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
    }


}

これで、すべての構成が完了し、構成スキャンされたすべての@Entityクラスが異なるデータベースに対応します.