Spring boot 主自动配置的spring boot辅助数据源
我正在尝试配置两个jpa数据源,我的做法与相同,每件事都很好,但是否可以自动完成自动配置,只添加一个新的jpa数据源,而无需手动创建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
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没有直接从属性加载之外,上面的示例工作得非常好