Spring boot 主自动配置的spring boot辅助数据源

Spring boot 主自动配置的spring boot辅助数据源,spring-boot,spring-data-jpa,Spring Boot,Spring Data Jpa,我正在尝试配置两个jpa数据源,我的做法与相同,每件事都很好,但是否可以自动完成自动配置,只添加一个新的jpa数据源,而无需手动创建LocalContainerEntityManagerFactoryBean @Primary @Bean(name = "dataSource") @ConfigurationProperties(prefix="spring.datasource") public DataSource dataSource() { re

我正在尝试配置两个jpa数据源,我的做法与相同,每件事都很好,但是否可以自动完成自动配置,只添加一个新的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;
}

我不确定您的具体问题是什么,也不确定您希望完成什么,但我将向您展示我如何使用Spring Boot的两个数据源,使用自动配置功能:

为每个数据源创建配置(在单独的类中,以便更好地读取):

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();
 }

}
@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;
   }       
}
SecondaryDbConfig.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();
 }

}
@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;
   }       
}
使用每个DAO各自的
PersistenceContext
unitName

OneDaoImpl.java

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

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

public List<One> getAllOne() {      
    return (List<One>) manager.createQuery("FROM ONE", One.class).getResultList();
}
}
@Repository(value = "anotherDaoImpl")
public class AnotherDaoImpl {

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


public List<Another> getAllAnother() {      
    return (List<Another>) manager.createQuery("FROM Another", Another.class).getResultList();
}
}

您可能知道,如果将与这些类和Anotation一起使用,您应该能够同时使用这两个数据源。

我不确定您的具体问题是什么,或者您希望完成什么,但我将向您展示我如何使用Spring Boot的两个数据源,使用自动配置功能:

为每个数据源创建配置(在单独的类中,以便更好地读取):

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();
 }

}
@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;
   }       
}
SecondaryDbConfig.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();
 }

}
@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;
   }       
}
使用每个DAO各自的
PersistenceContext
unitName

OneDaoImpl.java

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

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

public List<One> getAllOne() {      
    return (List<One>) manager.createQuery("FROM ONE", One.class).getResultList();
}
}
@Repository(value = "anotherDaoImpl")
public class AnotherDaoImpl {

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


public List<Another> getAllAnother() {      
    return (List<Another>) manager.createQuery("FROM Another", Another.class).getResultList();
}
}

您可能知道,如果您将与这些类和Anotation一起使用,您应该能够同时使用这两个数据源。

只要您将其中一个标记为a
@Primary
,就可以使用。对于第二个,您必须手动配置它。spring-boot将不会自动配置LocalContainerEntityManagerFactoryBean为辅助配置时,我的问题是是否可以强制它自动创建itDoh。是的,我只想到了数据源,不应该混为一谈。但是不,你不能强制自动创建,因为它有一个条件。你的问题是和的重复。简而言之,使用
@Qualifier
,只要您将一个标记为
@Primary
,它就可以工作。对于第二个,您必须手动配置它。spring-boot将不会自动配置LocalContainerEntityManagerFactoryBean当为辅助配置一个时,我的问题是我可以强制它自动创建itDoh吗。是的,我只想到了数据源,不应该混为一谈。但是不,你不能强制自动创建,因为它有一个条件。你的问题是和的重复。简短的回答,使用
@Qualifier
关于这一点,我想将嵌入式数据库添加到我现有的项目中,而无需再次手动操作。除了spring.jpa.properties.hibernate.dialogue:org.hibernate.dialogue.mysql5dialogue没有直接从properties加载之外,上面的示例工作得非常好。关于这一点,我想将嵌入式数据库添加到现有项目中,而不必再次手动执行所有操作。除了spring.jpa.properties.hibernate.dialogue:org.hibernate.dialogue.mysql5dialogue没有直接从属性加载之外,上面的示例工作得非常好