具有主要自动配置的spring boot辅助数据源

Sha*_*our 1 spring-data-jpa spring-boot

我正在尝试配置两个jpa数据源,我做了同样的例子,每件事都很好,但是可以自动完成自动配置,只需添加一个新的,无需LocalContainerEntityManagerFactoryBean手动创建.

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

@Bean
PlatformTransactionManager transactionManager() {
    return new JpaTransactionManager(entityManagerFactory().getObject());
}

@Bean
LocalContainerEntityManagerFactoryBean entityManagerFactory() {

    HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
    jpaVendorAdapter.setGenerateDdl(false);

    LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();

    factoryBean.setDataSource(dataSource());
    factoryBean.setJpaVendorAdapter(jpaVendorAdapter);

    factoryBean.setPackagesToScan("com.xxxxxxxx.common.domain","com.xxxxxxx.tekram.cdrserver.domain");

    return factoryBean;
}
Run Code Online (Sandbox Code Playgroud)

exo*_*dus 5

我不确定你的具体问题是什么,或者你想要实现什么,但我会告诉你如何使用自动配置功能在Spring Boot中使用两个dataSource:

为每个数据源创建配置(在单独的类中只为了更好的阅读):

PrimaryDbConfig.java

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.aoc.dao", entityManagerFactoryRef = "entityManager", transactionManagerRef = "transactionManager")
public class PrimaryDBConfiguration {

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

 @PersistenceContext(unitName = "primary")   
 @Primary
 @Bean(name = "entityManager")
 public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
      return builder.dataSource(dataSource())
              .persistenceUnit("primary")                 
              .packages("com.aoc.model")
              .build();
 }

}
Run Code Online (Sandbox Code Playgroud)

SecondaryDbConfig.java

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.aoc.dao", entityManagerFactoryRef = "secondaryEntityManager", transactionManagerRef = "secondaryTransactionManager")
public class SecondaryDBConfiguration {
  @Bean
  @ConfigurationProperties(prefix = "secondary.datasource")
   public DataSource secDataSource() {
        return DataSourceBuilder.create().build();
   }
  @PersistenceContext(unitName = "secondary")
  @Bean(name = "secondaryEntityManager")
  public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
       return  builder.dataSource(secDataSource())                 
               .persistenceUnit("secondary")
               .packages("com.aoc.siri")
               .build();
  }

  @Bean(name = "secondaryTransactionManager")
   public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
         JpaTransactionManager tm = new JpaTransactionManager();
         tm.setEntityManagerFactory(entityManagerFactory(builder).getObject());
         tm.setDataSource(secDataSource());
         return tm;
   }       
}
Run Code Online (Sandbox Code Playgroud)

用它分别对每个DAO进行旋转PersistenceContext unitName:

OneDaoImpl.java

@Repository(value = "OneDaoImpl")
public class OneDaoImpl {

@PersistenceContext(unitName="primary")
private EntityManager manager;

public List<AplicacioMsc> getAllOne() {     
    return (List<One>) manager.createQuery("FROM ONE", One.class).getResultList();
}
}
Run Code Online (Sandbox Code Playgroud)

AnotherDaoImpl.java

@Repository(value = "anotherDaoImpl")
public class AnotherDaoImpl {

@PersistenceContext(unitName = "secondary")
private EntityManager manager;


public List<Producte> getAllAnother() {     
    return (List<Another>) manager.createQuery("FROM Another", Another.class).getResultList();
}
}
Run Code Online (Sandbox Code Playgroud)

然后在你的 src/main/resources/application.properties

primary.datasource.driver-class-name=...
primary.datasource.url=...
primary.datasource.username=xxx
primary.datasource.password=yyy

secondary.datasource.driver-class-name=...
secondary.datasource.url=...
secondary.datasource.username=zzz
secondary.datasource.password=xxx
Run Code Online (Sandbox Code Playgroud)

您可能知道,如果您使用推荐的Spring Boot软件包命名这些类和anotations,您应该能够同时使用这两个dataSource.