2017-10-27 9 views
1

次のように私は、私のアプリでは2 DataSourceを初期化したい:セカンダリDataSourceからCrudRepositoryとEntityManagerを挿入する方法は?

@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」からEntityManagerをどのように注入できますか?

+0

Datasources/EntityMangerの場合、 '@修飾子'アノテーションを使用できます。どちらを注入するかを指定するには – Lino

+0

はい、セカンダリの 'EntityManager'または' TransactionManager'の名前はどうですか?セカンダリdsの '@ Bean'を作成するときに、おそらく暗黙のビルドであると思いますか? – membersound

+0

これが役に立っているのかどうかはわかりませんが、[ルーティングデータソース](https://spring.io/blog/2007/01/23/dynamic-datasource-routing/)を見てみてください – Lino

答えて

1

複数のデータソースを使用する場合は、データソースごとに異なるパッケージに構成することが重要です。アクセスする必要があるデータソースに応じて、これらのパッケージ間でエンティティを分離する必要があります。

また、これらのパッケージ内の各データソースに対してエンティティマネージャとトランザクションマネージャの両方を実装する必要があります。

多くの理論には?実用的で、それは次のようになります。そして、パッケージ2のための同じをして楽しむ

@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); 
    } 
} 

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は次のようになりますか。

幸運を祈る!

+0

実際には、複数のデータベースを使用する必要がある場合、ds、txmanagerおよびemfを構築する必要があります。 – membersound