Java 如何从辅助数据源注入Crudepository和EntityManager?

Java 如何从辅助数据源注入Crudepository和EntityManager?,java,spring,spring-data-jpa,Java,Spring,Spring Data Jpa,我想在我的应用程序中初始化两个数据源,如下所示: @Configuration public class DataSourceConfig { @Bean @Primary @ConfigurationProperties(prefix="spring.datasource") public DataSource primaryDataSource() { return DataSourceBuilder.create().build();

我想在我的应用程序中初始化两个
数据源
,如下所示:

@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> {
}
现在,我想按如下方式使用辅助数据源:

@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> {
}
公共类二次数据库服务{
@自动连线
私人实体管理者;
@自动连线
私人二手储粮道;
}
接口SecondaryCrudepository实现Crudepository{
}
如果按上述方式配置,服务将使用主数据源


问题:我如何告诉
crudepository
依赖“secondaryDataSource”?同样,我如何从“secondaryDataSource”注入
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进行同样的操作并享受


祝你好运

对于数据源/EntityManger,您可以使用
@限定符
-注释。要指定要插入的是,但是辅助
EntityManager
TransactionManager
的名称如何?我假设在创建辅助ds的
@Bean
时,它们可能是隐式构建的?我不确定这是否有帮助,但可能需要看看或者我需要自己构建
EntityManager
TxManager
?blogpost没有帮助,因为我在这里没有使用
JdbcTemplate
。实际上,当需要使用多个数据库时,必须构建ds、txmanager和emf显式。