9 コンポジット永続性ユニットによる複数データベースの使用

この章では、Oracle TopLinkコンポジット永続性ユニットを使用して、(エンティティ・タイプの独自のセットがそれぞれに設定された)複数の永続性ユニットを単一の永続性コンテキストとして公開する方法について説明します。コンポジット永続性ユニットの一部である個々の永続性ユニットを、コンポジット・メンバー永続性ユニットと呼びます。

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 単純なコンポジット永続性ユニット

図9-1の説明が続きます
図9-1「単純なコンポジット永続性ユニット」の説明

例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();

コンポジット永続性ユニットの要件

コンポジット永続性ユニットを使用する際には、次の要件に注意してください。

  • 各コンポジット・メンバー永続性ユニットの名前は、コンポジット内で一意である必要があります。

  • 永続性ユニット全体に対応するtransaction-typeおよび他のプロパティ(ターゲット・サーバー、ロギング・トランザクションなど)はコンポジット永続性ユニットで定義してください。そうでない場合、コンポジット・メンバーに定義されたトランザクション・タイプ、ターゲット・サーバー情報、ロギング・プロパティは無視されます。

ソリューションの実装

タスク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)拡張機能リファレンス』@CompositeMembercomposite.unitcomposite-unit.memberに関する項を参照してください。

  • コンポジット永続性ユニットの制限

  • 依存関係が含まれるコンポジット・メンバー永続性ユニットの構成

  • コンポジット永続性ユニットおよびコンポジット・メンバー永続性ユニットで使用されるすべての永続性ユニット・プロパティ

  • コンポジット永続性ユニットEntityManagerFactoryを作成中に、Persistence.createEntityManagerFactoryメソッドでコンポジット・メンバー永続性ユニットに永続性ユニット・プロパティを渡す方法

  • コンポジット永続性ユニットおよびコンポジット・メンバー永続性ユニットで使用されるすべてのエンティティ・マネージャ

  • コンポジット永続性ユニットEntityManagerFactoryemf.createEntityManagerメソッドでコンポジット・メンバー永続性ユニットにエンティティ・マネージャ・プロパティを渡す方法

関連Javadoc

詳細は、Oracle TopLink Java APIリファレンスで次のAPIを参照してください。

  • PersistenceUnitPropertiesクラス

  • Persistence.createEntityMangerクラス

  • EntityManagerFactoryインタフェース