我真的不知道什麼是你的具體問題,或者您希望acomplish什麼,但我會使用自動配置功能,你展示如何,我用了兩個數據源和春天啓動:
(只是爲了更好地閱讀在單獨的類)創建爲每個數據源配置:
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();
}
}
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;
}
}
Anotate與它的每一個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();
}
}
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();
}
}
然後在你的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
正如你可能知道,如果你使用recommended Spring Boot packages naming這些類和偏移量,你應該能夠同時使用這兩個數據源。
只要您標記一個'@ Primary',就應該可以工作。 –
對於你的第二個,你將不得不手動配置它。 –
當一個配置爲輔助時,spring-boot不會自動配置LocalContainerEntityManagerFactoryBean,我的問題是我可以強制它自動創建它 – Shahbour