プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Coherenceの統合
12c (12.2.1.3.0)
E90216-02
目次へ移動
目次

前
次

1 JPAとCoherenceの併用

Coherenceでは、Java Persistence API (JPA)を使用してオブジェクトをデータベースにロードおよびストアするCacheStoreおよびCacheLoaderインタフェースのネイティブな、エンティティ・ベースの実装が提供されます。CoherenceでJPAを使用する前に、CacheStoreおよびCacheLoaderインタフェースに精通している必要があります。これらのインタフェースはデータソースをキャッシュするために使用されます。データ・ソースのキャッシュを参照してください。

注意:

CoherenceおよびJPAでは、リソース・ローカルおよびブートストラップのエンティティ・マネージャのみを使用できます。コンテナ管理のエンティティ・マネージャ、およびJava Transaction Architecture (JTA)トランザクションを使用するマネージャは、現在サポートされていません。

この章の内容は次のとおりです。

1.1 JPA CacheStoreおよびCacheLoaderの実装の概要

Oracle Coherenceでは、JPAで使用できるCacheStoreおよびCacheLoaderインタフェースの2つの実装(汎用JPA実装およびEclipseLink固有の実装)が提供されます。両方の実装で、エンティティはデータ・ストアにマップされている必要があり、JPAの永続性ユニット構成が存在する必要があります。JPA永続性ユニットは、永続化可能なユーザー定義のエンティティ・クラスとそれらの設定からなる論理グループとして定義されます。JPAランタイム構成ファイルpersistence.xmlと、デフォルトのJPAオブジェクト・リレーショナル・マッピング・ファイルorm.xmlは通常、JPAソリューションの一部として提供されます。

表1-1は、Coherenceで提供されるJPA実装を示しています。

表1-1 Coherenceに付属するJPA関連のCacheStoreとCacheLoader API

クラス名 場所 説明

JpaCacheStore

COHERENCE_HOME\lib\coherence-jpa.jar

Coherence CacheStoreインタフェースのJPA実装。このクラスをロードとストアの完全な実装として使用します。これは、任意のJPA実装を使用して、データ・ストアとの間でエンティティをロードおよび格納できます。

注意: 永続性ユニットは、RESOURCE_LOCALトランザクションを使用するように設定されていることが前提になります。

JpaCacheLoader

Coherence CacheLoaderインタフェースのJPA実装。このクラスをロード専用の実装として使用します。これは、任意のJPA実装を使用してデータ・ストアからエンティティをロードできます。

ロードとストアの完全な実装には、JpaCacheStoreクラスを使用します。

EclipseLinkJPACacheStore ORACLE_HOME\oracle_common\modules\oracle.toplink_version\toplink-grid.jar

Coherence CacheStoreインタフェースのEclipseLink固有のJPA実装。この実装はアプリケーションからCoherenceを直接使用することを目的とするもので、キャッシュ・ストアおよびローダーは舞台裏でデータの永続化およびロードに使用されます。

注意: この実装を使用する場合は、EclipseLink-Coherence統合からのキャッシュ・インターセプタまたは問合せリダイレクタが、特定のクラスの永続性ユニット内に設定されていないことを確認します。

EclipseLinkJPACacheLoader

Coherence CacheLoaderインタフェースのEclipseLink固有のJPA実装。

注意: この実装を使用する場合は、EclipseLink-Coherence統合からのキャッシュ・インターセプタまたは問合せリダイレクタが、特定のクラスの永続性ユニット内に設定されていないことを確認します。

1.2 JPAプロバイダ実装の入手

JPAプロバイダにより、SQL文を使用するのではなく、直接Javaオブジェクトを操作できます。データをマップ、格納、更新および取得することができ、データベース・エンティティとJavaオブジェクト間の変換はプロバイダによって実行されます。

JPA 2.0仕様のリリファレンス実装であるEclipseLink JPA、およびOracle TopLinkで使用されるJPAプロバイダを使用することをお薦めします。EclipseLinkでは、キャッシュ、スレッド、および全体的なパフォーマンスのための数多くの高度な機能を備え、パフォーマンスに優れたJPA実装が提供されます。

EclipseLinkのJARファイル(eclipselink.jar)は、Coherenceインストールに含まれており、ORACLE_HOME\oracle_common\modules\oracle.toplink_versionフォルダにあります。

1.3 Coherence JPAキャッシュ・ストアの構成

CoherenceでJPAを使用するには、永続性プロパティを構成し、JpaCacheStore実装を使用するキャッシュを定義する必要があります。

この項には次のトピックが含まれます:

1.3.1 永続クラスのマッピング

データベースにエンティティ・クラスをマップします。これにより、JPAキャッシュ・ストアを介してオブジェクトをロードおよび格納できます。JPAマッピングは標準仕様に準拠しているため、すべてのJPAプロバイダに対して同じ方法で指定できます。

エンティティは、エンティティ・クラスに注釈を付けるか、orm.xmlまたは他のXMLマッピング・ファイルを追加することでマップできます。JPAエンティティのマップ方法の詳細は、JPAプロバイダのドキュメントを参照してください。

1.3.2 JPAの構成

JPA構成を作成するには、persistence.xmlファイルを編集します。このファイルには、ランタイムの動作を指示するプロパティがあります。

RESOURCE_LOCALにトランザクション・タイプを設定し、JPAプロバイダに必要なJDBCプロパティ(driverurluserpasswordなど)には、データベースへの接続およびログインに適した値を指定します。JPA注釈を使用してマップされるクラスは、<class>要素に記述してください。例1-1は、設定可能な一般的なプロパティを含むpersistence.xmlファイルの例を示しています。

例1-1 JPAのpersistence.xmlファイルのサンプル

<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="EmpUnit" transaction-type="RESOURCE_LOCAL"> 
    <provider>
        org.eclipse.persistence.jpa.PersistenceProvider
    </provider>
    <class>com.oracle.coherence.handson.Employee</class>
    <properties>
        <property name="eclipselink.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
        <property name="eclipselink.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
        <property name="eclipselink.jdbc.user" value="scott"/>
        <property name="eclipselink.jdbc.password" value="tiger"/>
    </properties>
</persistence-unit>
</persistence>

1.3.3 JPA用のCoherenceキャッシュの構成

coherence-cache-config.xmlファイルを作成して、デフォルトのCoherence設定をオーバーライドし、キャッシュ・スキームを定義します。キャッシュ・スキームには、JPA実装クラスをリストする<cachestore-scheme>要素があり、次のパラメータが含まれます。

  • 格納するエンティティのエンティティ名。JPAで明示的にオーバーライドされていないかぎり、エンティティ・クラスの非修飾名になります。例1-2では、組込みのCoherenceマクロ{cache-name}を使用して、キャッシュ・ストアを構成および使用するキャッシュの名前に変換します。永続エンティティの種類ごとに別個のキャッシュを使用した後、各キャッシュの名前が、その中に格納されるエンティティの名前に従って設定されるため、この操作は正常に処理されます。

  • エンティティ・クラスの完全修飾名。すべてのクラスが同一パッケージ内にあり、デフォルトのJPAエンティティ名を使用する場合は、ここでも{cache-name}マクロを使用して、エンティティの種類ごとに異なる部分に入力できます。このようにすることで、同じ永続性ユニット内でキャッシュされるすべてのエンティティで、同じキャッシング・スキームを使用できます。

  • 永続性ユニット名。これは、persistence.xmlファイルで指定した名前と同じにする必要があります。

これにより、様々な名前付きのキャッシュに対して、JPAキャッシング・スキームの使用が指示されます。例1-2は、Employeeという名前のキャッシュを定義するcoherence-cache-config.xmlファイルのサンプルで、これによってEmployeeクラスのインスタンスがキャッシュされます。このキャッシュは、JpaCacheStore実装を使用するように構成されています。追加クラス用のエンティティ・キャッシュを定義するには、さらに<cache-mapping>要素をこのファイルに追加します。

例1-2 JPAキャッシング・スキームに対する名前付きキャッシュの割当て

<cache-config>
  <caching-scheme-mapping>
    <cache-mapping>
      <!-- Set the name of the cache to be the entity name.  -->
      <cache-name>Employee</cache-name>
      <!-- Configure this cache to use the following defined scheme. -->
      <scheme-name>jpa-distributed</scheme-name>
    </cache-mapping>
  </caching-scheme-mapping>
  <caching-schemes>
    <distributed-scheme>
      <scheme-name>jpa-distributed</scheme-name>
      <service-name>JpaDistributedCache</service-name>
      <backing-map-scheme>
        <read-write-backing-map-scheme>
          <internal-cache-scheme>
            <local-scheme/>
          </internal-cache-scheme>
          <!- Define the cache scheme. -->
          <cachestore-scheme>
            <class-scheme>
              <class-name>
                com.tangosol.coherence.jpa.JpaCacheStore
              </class-name>
              <init-params>

                <!-- This param is the entity name. -->
                <init-param>
                  <param-type>java.lang.String</param-type>
                  <param-value>{cache-name}</param-value>
                </init-param>

                <!-- This param is the fully qualified entity class. -->
                <init-param>
                  <param-type>java.lang.String</param-type>
                  <param-value>com.acme.{cache-name}</param-value>
                </init-param>

                <!-- This param should match the value of the -->
                <!-- persistence unit name in persistence.xml. -->
                <init-param>
                  <param-type>java.lang.String</param-type>
                  <param-value>EmpUnit</param-value>
                </init-param>
              </init-params>
            </class-scheme>
          </cachestore-scheme>
        </read-write-backing-map-scheme>
      </backing-map-scheme>
    </distributed-scheme>
  </caching-schemes>
</cache-config>

1.3.4 永続性ユニットの構成

JPAのキャッシュ・ストアまたはローダーの実装を使用する場合は、エンティティが挿入または更新されたときにエンティティが変更されないように永続性ユニットを構成します。JPAプロバイダによるエンティティへの変更は、いずれもCoherenceキャッシュには反映されません。これは、キャッシュ内のエンティティがデータベースの内容と一致しなくなることを意味します。特に、エンティティがIDを取得する際に、ID生成(@GeneratedValueなど)が使用されないようにします。IDは、オブジェクトがCoherenceに格納される前にアプリケーション・コードで割り当てる必要があります。通常、IDはCoherenceに格納されるエンティティが属するキーになります。

オプティミスティック・ロック(@Versionなど)は、データベース・トランザクションのコミットに失敗する可能性があるため使用しないでください。

JPAのキャッシュ・ストアまたはローダーの実装を使用する場合は、永続性ユニットでL2 (共有)キャッシュを無効にする必要があります。ご使用のプロバイダのドキュメントを参照してください。EclipseLinkでは、個別のエンティティに@Cache(shared=false)と指定するか、デフォルトとしてpersistence.xmlファイルの次のプロパティに指定できます。

<property name="eclipselink.cache.shared.default" value="false"/>