java - 如何从辅助数据源注入(inject) CrudRepository 和 EntityManager?

标签 java spring spring-data-jpa

我想在我的应用中初始化两个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/

相关文章:

java - Spring Boot - 在类路径资源中创建名称为 'dataSource' 的 bean 时出错

java - 膨胀 View 时 WebCachedImageView 解析 XML 时出错

java - 如何创建 Java(6) Hibernate(3.6) 实体或其他构造来创建 string + int 的唯一组合

java - 使用 Spring HibernateTemplate。如何按ID删除?

java - 创建类的对象时找不到方法 <init>()V

java - Spring Data JPA 在两个查询中加载一对一关系

java - 如何在条件查询中的非实体字段上创建orderby?

java - Java RuntimeException enableSuppression 参数有什么作用?

java - java中的默认初始化

java - Spring Data JPA native 查询中的变量