我想在我的应用中初始化两个DataSource
,如下:
@Configuration
public class DataSourceConfig {
@Bean
@Primary
@ConfigurationProperties(prefix="spring.datasource")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="spring.datasource2")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
现在我想按如下方式显式使用辅助数据源:
public class SecondaryDbService {
@Autowired
private EntityManager em;
@Autowired
private SecondaryCrudRepository dao;
}
interface SecondaryCrudRepository implements CrudRepository<SecondaryEntity, Long> {
}
如果配置如上,服务将使用主要数据源。
问题:如何告诉 CrudRepository
依赖于“secondaryDataSource”?同样,如何从“secondaryDataSource”注入(inject) EntityManager
?
最佳答案
如果要使用多个数据源,关键是将每个数据源的配置放在不同的包中。您将需要根据它们应该访问的数据源将这些包之间的实体分开。
您还必须为这些包中的每个数据源实现实体和事务管理器。
太多的理论?实际上它看起来像这样:
com.package1
- com.package1.entities
- EntityClass1.java (annotated with @Entity)
- ConfigForDataSource1.java
com.package2
- com.package2.entities
- EntityClass2.java (annotated with @Entity)
- ConfigForDataSource2.java
这是 ConfigForDataSource1 的样子:
@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerDataSource1",
basePackages = "com.package1",
transactionManagerRef = "TransactionManagerDataSource1")
public class MasterDBConfig {
@Bean(name="DataSource1")
@ConfigurationProperties(prefix = "datasource1.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name="entityManagerDataSource1")
public LocalContainerEntityManagerFactoryBean entityManagerDataSource1(EntityManagerFactoryBuilder builder,@Qualifier("DataSource1") DataSource dataSource) {
return builder.dataSource(dataSource).packages("com.package1").persistenceUnit("DataSource1").build();
}
@Bean(name = "TransactionManagerDataSource1")
public PlatformTransactionManager TransactionManagerDataSource1(@Qualifier("entityManagerDataSource1") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
然后对套餐 2 执行相同的操作并享用。
祝你好运!
关于java - 如何从辅助数据源注入(inject) CrudRepository 和 EntityManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46973878/