TopLinkでは、コンポジット永続性ユニットを使用して、(エンティティ・タイプの独自のセットがそれぞれに設定された)複数の永続性ユニットを単一の永続性コンテキストとして公開できます。コンポジット永続性ユニットの一部である個々の永続性ユニットを、コンポジット・メンバー永続性ユニットと呼びます。
この章では、次の項目について説明します。
コンポジット永続性ユニットでは、次のことを行えます。
コンポジット永続性ユニット内の任意のエンティティ間の関係のマッピング
複数のデータベースおよび様々なデータ・ソースにストアされているエンティティへのアクセス
エンティティの完全なセット全体に対する問合せおよびトランザクションの容易な実行
例4-1は、1つのコンテキストから2つの異なるデータベースにデータを永続化する方法を示しています。
例4-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();
図4-1は、単純な複数永続性ユニットを示しています。EntityManagerは、(Persistence.createEntityManagerFactoryメソッドにそれらを渡して)次の2つの複合メンバー永続性ユニットを含む複合永続性ユニットをインスタンス化します。
クラスAは、member1.jarにあるmemberPu1という名前の永続性ユニットによってマップされています。
クラスBは、member2.jarにあるmemberPu2という名前の永続性ユニットによってマップされています。
コンポジット永続性ユニットを使用する際には、次の要件に注意してください。
各コンポジット・メンバー永続性ユニットの名前は、コンポジット内で一意である必要があります。
永続性ユニット全体に対応するtransaction-typeおよび他のプロパティ(ターゲット・サーバー、ロギング・トランザクションなど)はコンポジット永続性ユニットで定義してください。そうしないと、アプリケーションはデフォルトを使用します。
すべてのコンポジット・メンバー永続性ユニットで、同じtransaction-typeをコンポジット永続性ユニットとして使用する必要があります。
この項には、次の項目が含まれます。
コンポジット永続性ユニットは通常の永続性要素なので、persistence.xmlファイルが必要です。例4-2に、persistence.xmlのサンプル・ファイルを示します。
例4-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ファイルで見つかったすべての永続性ユニットが含まれます。
コンポジット永続性ユニットは他の永続性ユニットと同様に使用できます。次に示すように、EntityManagerを注入できます。
@PersistenceUnit(unitName="compositePu") EntityManagerFactory entityManagerFactory; @PersistenceUnit(unitName="compositePu") EntityManager entityManager;
また、手動で作成することもできます。
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("compositePu", properties);
複数の永続性ユニットをデプロイするには、同じクラス・ローダーのすべてのJAR (コンポジットおよびそのメンバー)をデプロイします。
Oracle WebLogic Serverにデプロイする際には、JARをEARファイルにパッケージ化します。
スタンドアロン・アプリケーションとして実行する際には、JARをクラス・パスに追加します。
重要な情報および制限は、4.1.1項「コンポジット永続性ユニットの要件」を参照してください。
コンポジット永続性ユニットに関する次のような追加情報は、EclipseLinkドキュメントのhttp://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Composite_Persistence_Unitsを参照してください。
コンポジット永続性ユニットの制限
相互の依存関係が含まれるコンポジット・メンバー永続性ユニットの構成
コンポジット永続性ユニットおよびコンポジット・メンバー永続性ユニットで使用されるすべての永続性ユニット・プロパティ
コンポジット永続性ユニットEntityManagerFactoryを作成中に、Persistence.createEntityManagerFactoryメソッドでコンポジット・メンバー永続性ユニットに永続性ユニット・プロパティを渡す方法
コンポジット永続性ユニットおよびコンポジット・メンバー永続性ユニットで使用されるすべてのエンティティ・マネージャ
コンポジット永続性ユニットEntityManagerFactoryのemf.createEntityManagerメソッドでコンポジット・メンバー永続性ユニットにエンティティ・マネージャ・プロパティを渡す方法