2016-10-21 13 views

答えて

0

代わりに、2つの異なるLocalContainerEntityManagerFactoryBeanインスタンスをそれぞれの適切な方言で初期化し、次にコードがどのデータベースと対話するかに基づいて正しいEntityManagerを参照するだけです。

@PersistenceContext(unitName = "dialect1PersistenceUnit") 
private EntityManager entityManager1; 

@PersistenceContext(unitName = "dialect2PersistenceUnit") 
private EntityManager entityManager2; 

本当に動的でなければならないものがいくつかあります。

一度に1つのデータソースで作業する場合は、データベースをAbstractRoutingDataSourceに基づいて設定し、使用する永続コンテキストを決定するスレッドローカル値を設定します。通常、トランザクション管理のアスペクトを呼び出す前に、サービス層ラッパーのスレッドローカル値を設定します。

別の方法としては、以下に示すように、EntityManagerFactoryではなくEntityManagerを注入し、その場で自分自身EntityManagerを構築するために、次のようになります。

Map props = new HashMap(); 
props.put("org.hibernate.dialect", YourDialectClass.class.getName()); 

EntityManager entityManager = entityManagerFactory.createEntityManager(props); 

HTH。

+0

私たちのアプリケーションがH2をデフォルトのデータソースとして指しているので、私たちはテナント(データベース)を動的に構成でき、Oracle、Mysql、MSSQlでもかまいません。実行時には方言を決定する必要があります – singh

+0

私の答え。 – Naros

+0

ありがとうナロス。エンティティマネージャを動的に作成するアプローチをとる必要があります。他のソリューションは機能しません。 – singh

関連する問題