9 コンポジット永続性ユニットによる複数データベースの使用
EclipseLinkでは、コンポジット永続性ユニットを使用して、(エンティティ・タイプの独自のセットがそれぞれに設定された)複数の永続性ユニットを単一の永続性コンテキストとして公開できます。コンポジット永続性ユニットの一部である個々の永続性ユニットを、コンポジット・メンバー永続性ユニットと呼びます。
注意:
TopLinkは、パーティショニングを通じて複数のデータベースをサポートしています。「クラスタ内のアプリケーションのスケーリング」を参照してください。
この章の内容は次のとおりです。
ユース・ケース
ユーザーが、複数の永続性ユニットをアプリケーション内で1つの永続性コンテキストとして公開する必要があります。
解決方法
TopLinkでは、複数のメンバーの永続性ユニットを含むコンポジット永続性ユニットをサポートできます。
コンポーネント
-
TopLink 12c (12.1.2.0.0)以上。
注意:
TopLinkのコア機能は、オープン・ソースのEclipse Foundationの永続性フレームワークであるEclipseLinkによって提供されています。EclipseLinkでは、Java Persistence API (JPA)、Java Architecture for XML Binding (JAXB)、および標準に基づいたその他の永続性テクノロジと、それらの標準の拡張が実装されます。TopLinkには、EclipseLinkのすべてに加え、Oracleの追加機能が含まれています。
-
EclipseLink 2.4.2以降。
-
複数のデータベース。
サンプル
関連情報は、次のEclipseLinkの例を参照してください。
ソリューションの概要
コンポジット永続性ユニットでは、次のことを行えます。
-
複数の永続性ユニット内の任意のエンティティ間のリレーションシップのマッピング
-
複数のデータベースおよび様々なデータ・ソースにストアされているエンティティへのアクセス
-
エンティティの完全なセット全体に対する問合せおよびトランザクションの容易な実行
例9-1は、1つの永続性コンテキストから2つの異なるデータベースにデータを永続化する方法を示しています。
図9-1は、単純なコンポジット永続性ユニットを示しています。EclipseLinkではpersistence.xml
ファイルを処理し、2つのコンポジット・メンバー永続性ユニットを含むコンポジット永続性ユニットを検出します。
-
クラスAは、
member1.jar
ファイルにあるmemberPu1という名前の永続性ユニットによってマップされています。 -
クラスBは、
member2.jar
ファイルにあるmemberPu2という名前の永続性ユニットによってマップされています。
例9-1 複数のデータベースの使用
em.persist(new A(..)); em.persist(new B(..)); // You can insert A into database1 and insert B into database2. // The two databases can be from different vendors. em.flush();
ソリューションの実装
この項には、次の項目が含まれます。
タスク1: コンポジット永続性ユニットの構成
コンポジット永続性ユニットは通常の永続性要素なので、persistence.xml
ファイルが必要です。例9-2に、persistence.xml
のサンプル・ファイルを示します。datasource
またはjdbc
プロパティがないことを確認してください。
例9-2 コンポジット永続性ユニットのpersistence.xmlファイル
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd" version="1.0"> <persistence-unit name="compositePu" transaction-type="JTA"> <provider> org.eclipse.persistence.jpa.PersistenceProvider </provider> <jar-file>member1.jar</jar-file> <jar-file>member2.jar</jar-file> <properties> <property name="eclipselink.composite-unit" value="true"/> <property name="eclipselink.target-server" value="WebLogic_10"/> </properties> </persistence-unit> </persistence>
オプションで、<property name="eclipselink.composite-unit" value="true"/>
プロパティを使用して、永続性ユニットをコンポジット永続性ユニットとして指定できます。
<jar-file>
要素を使用して、コンポジット・メンバー永続性ユニットを含むJARファイルを指定します。コンポジット永続性ユニットには、指定したJARファイルであるすべてのコンポジット・メンバー永続性ユニットが含まれます。
タスク2: コンポジット永続性ユニットの使用
コンポジット永続性ユニットは他の永続性ユニットと同様に使用できます(次に示すとおり、EntityManager
を注入されます)。
@PersistenceContext(unitName="compositePu") EntityManagerFactory entityManagerFactory; @PersistenceContext(unitName="compositePu") EntityManager entityManager;
また、手動で作成することもできます。
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("compositePu", properties);
タスク3: コンポジット永続性ユニットのデプロイ
複数の永続性ユニットをデプロイするには、同じクラス・ローダーにすべてのJARファイル(コンポジット永続性ユニットおよびそのメンバー)をデプロイします。
-
Oracle WebLogic Serverにデプロイする場合は、JARファイルをEARファイル、またはWARファイルの
WEB-INF/lib
フォルダにパッケージします。 -
スタンドアロン・アプリケーションとして実行している場合、クラス・パスにJARファイルを追加します。
重要な要件については、「コンポジット永続性ユニットの要件」を参照してください。
その他の参考資料
この章のソリューションが実装されているその他のテクノロジおよびツールの詳細は、次の参考資料を参照してください。
コンポジット永続性ユニットに関するその他の情報は、『Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス』の@CompositeMember
、composite.unit
、composite-unit.member
に関する項を参照してください。
-
コンポジット永続性ユニットの制限
-
依存関係が含まれるコンポジット・メンバー永続性ユニットの構成
-
コンポジット永続性ユニットおよびコンポジット・メンバー永続性ユニットで使用されるすべての永続性ユニット・プロパティ
-
コンポジット永続性ユニット
EntityManagerFactory
を作成中に、Persistence.createEntityManagerFactory
メソッドでコンポジット・メンバー永続性ユニットに永続性ユニット・プロパティを渡す方法 -
コンポジット永続性ユニットおよびコンポジット・メンバー永続性ユニットで使用されるすべてのエンティティ・マネージャ
-
コンポジット永続性ユニット
EntityManagerFactory
のemf.createEntityManager
メソッドでコンポジット・メンバー永続性ユニットにエンティティ・マネージャ・プロパティを渡す方法
関連Javadoc
詳細は、Oracle TopLink Java APIリファレンスで次のAPIを参照してください。
-
PersistenceUnitProperties
クラス -
Persistence.createEntityManger
クラス -
EntityManagerFactory
インタフェース