2017-02-08 6 views
0

私の春ブーツMVCプロジェクトがうまく春のブートのデフォルト設定を使用して動作するリポジトリのインタフェースを介してデータベースと対話:Spring Boot JPA:同一のデータベースに対して複数のリポジトリを作成しないようにするにはどうすればよいですか?

spring: 
     datasource: 
     url: jdbc:mysql://localhost/some_schema 
     username: 
     ... 

    @Configuration 
    @EnableJpaRepositories(basePackages = {"my.path.to.repository"}) 
    public class Application extends WebMvcConfigurerAdapter { 
    .... 

は現在、いくつかの実行時の状況に応じて、私は同じ第二のデータベースと対話する必要があります(同じスキーマ)を別の場所に配置します。私が見つけた解決策は、データソースごとに個別のリポジトリパッケージを作成することを指しています。

しかし、データベースが同一であるため、追加された各データソースのリポジトリパッケージが重複しないようにエレガントな方法がありますか?

+0

いいえ、あなたは、複製する必要があります。なぜあなたは別の同一のスキーマが必要なのか、あなたが「エレガント」であることで節約していると思っているのかと尋ねます。 – duffymo

+0

「エレガントな」ソリューションは、可能であればコードの重複を避けるソリューションです。 – Saad

+0

これは設定です。選択肢はありません。使用するデータベースごとに構成が必要です。 3行の設定を書くよりも、スキーマを複製する方がはるかに多くの作業が必要です。重複したデータベースを削除する必要があるかもしれません。 – duffymo

答えて

0

あなたは春AbstractRoutingDataSourceでこれを達成することができます。

大雑把:

public class ChooseOneDataSource extends AbstractRoutingDataSource { 
    @Override 
    protected Object determineCurrentLookupKey() { 
     if (***some runtime condition***) { 
      return "dataSource1"; 
     } else { 
      return "dataSource2"; 
     } 
    } 
} 

そして、あなたのconguration中:詳細情報/例について

@Bean 
@ConfigurationProperties(prefix = "dataSource1") 
DataSource dataSource1() { 
return DataSourceBuilder.create().build(); 
} 

@Bean 
@ConfigurationProperties(prefix = "dataSource2") 
DataSource dataSource2() { 
return DataSourceBuilder.create().build(); 
} 

@Bean 
DataSource dataSource() { 
AbstractRoutingDataSource dataSource = new ChooseOneDataSource(); 
Map<Object,Object> resolvedDataSources = new HashMap<>(); 
resolvedDataSource.put("dataSource1", dataSource1()); 
resolvedDataSource.put("dataSource2", dataSource2()); 
dataSource.setDefaultTargetDataSource(dataSource1()); // << default 
dataSource.setTargetDataSources(resolvedDataSources); 
return dataSource; 
} 

http://fizzylogic.nl/2016/01/24/Make-your-Spring-boot-application-multi-tenant-aware-in-2-steps/ https://spring.io/blog/2007/01/23/dynamic-datasource-routing/

関連する問題