Java Persistence API(JPA)は、オブジェクト・リレーショナル・マッピング(ORM)およびエンタープライズJava Persistenceにおける標準です。現在、複数のオープンソースおよび商用の実装が存在しており、開発中のものもあります。
Coherenceには、JPAを使用してデータベースにオブジェクトをロードおよび格納できる、CacheStore実装が同梱されています。この章では、このCacheStoreの構成方法と使用方法について説明します。
|
注意: 現時点では、リソース・ローカルおよびブートストラップのエンティティ・マネージャのみがサポートされています。コンテナ管理のエンティティ・マネージャ、およびJTAトランザクションを使用するマネージャは、サポート対象ではありません。 |
JPAプロバイダはCoherenceに付属していませんが、容易に入手できます。
JPA CacheStoreは、準拠する任意のJPA実装で機能しますが、EclipseLink JPAを使用することをお薦めします。EclipseLink JPAは、JPA 2.0仕様のリファレンス実装です。オラクル社は、Eclipse JPAをはじめとする、オープンソースのEclipseLinkプロジェクトをリードしています。EclipseLinkは、Eclipseの次のURLで提供されています。
http://www.eclipse.org/eclipselink
Oracle Toplinkは、JPA実装としてEclipseLinkを組み込んでいます。ToplinkおよびEclipseLinkの詳細は、次のURLを参照してください。
http://www.oracle.com/technology/products/ias/toplink/index.html
この章は、次のJavaクラスおよびインタフェースについて説明します。
例1-1 JPA関連のクラスとインタフェース
com.tangosol.coherence.jpa.JpaCacheLoader com.tangosol.coherence.jpa.JpaCacheStore com.tangosol.net.NamedCache (extends java.util.Map) com.tangosol.net.cache.CacheLoader com.tangosol.net.cache.CacheStore
CacheStoreインタフェースはCacheLoaderを拡張するため、CacheStoreという用語は、一般的に、これら両方のインタフェースを表すために使用されます(どちらが適切かは、読取り専用または読取り/書込みがサポートされているかで決まる)。同様に、JpaCacheStoreも両実装を指します。
Coherenceキャッシュ・コンフィギュレーション・ファイルは、coherence-cache-config.xml(デフォルト名)と呼ばれます。JPA Persistenceの実装は、単にJPAプロバイダと呼ばれます。JPAランタイム・コンフィギュレーション・ファイルはpersistence.xmlと、JPAオブジェクト・リレーショナル・マッピング・ファイルは、orm.xml(デフォルト名)と呼ばれます。
JPAは、データベースへのJavaオブジェクトのマッピング、問合せ、格納に使用される標準APIです。ただし、キャッシング、スレッド処理および全体的なパフォーマンスについては、JPA実装ごとに特性が異なる場合があります。TopLinkは、数多くの高度な機能を備え、パフォーマンスに優れたJPA実装を提供します。
Coherenceには、デフォルトのエンティティベースのCacheStore実装として、JpaCacheStore(および対応するCacheLoader実装であるJpaCacheLoader)が組み込まれています。その他の情報については、実装するクラスのJavadocを参照してください。
CacheStoreでオブジェクトをロードおよび格納するための最初の手順は、データベースに対してクラスがマップされているかどうかを確認することです。JPAマッピングは標準仕様に準拠しているため、すべてのJPAプロバイダに対して同じ方法で指定できます。
エンティティは、エンティティ・クラスに注釈を付けるか、orm.xmlまたは他のXMLマッピング・ファイルを追加してマップされます。JPAエンティティのマップ方法の詳細は、JPAプロバイダのドキュメントを参照してください。
一般的なJPA構成では、persistence.xmlファイルを変更する必要があります。persistence.xml内には、ランタイムの動作を指示するプロパティがあります。
例1-2は、一般的なプロパティ設定を示すpersistence.xmlのサンプルを示しています。トランザクション・タイプはRESOURCE_LOCALに設定され、必要なJDBCプロパティ(eclipselink.jdbc.driver、url、user、およびpassword)には、使用するデータベースの接続およびログイン用の値が格納されます。JPA注釈を使用してマップされるクラスは、<class>要素に記述してください。
例1-2 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>
coherence-cache-config.xmlを指定して、デフォルトのCoherenceの設定をオーバーライドし、JpaCacheStoreキャッシング・スキームを定義する必要があります。キャッシング・スキームには、JpaCacheStoreクラスをリストし、3つのパラメータを含む<cachestore-scheme>要素が必要です。
格納するエンティティの名前です。JPAで明示的にオーバーライドされていないかぎり、エンティティ・クラスの非修飾名になります。例1-3では、組込みのCoherenceマクロ{cache-name}を利用して、CacheStoreを構成および使用するキャッシュの名前に変換します。永続エンティティの種類ごとに別個のキャッシュを使用した後、各キャッシュの名前がその中に格納されるエンティティの名前に従って設定されるため、この操作は正常に処理されます。
エンティティ・クラスの完全修飾名です。クラスのすべてが同一パッケージ内にあり、デフォルトのJPAエンティティ名を使用する場合は、ここでも{cache-name}マクロを使用して、エンティティの種類ごとに異なる部分に入力できます。このようにすることで、同じ永続性ユニット内でキャッシュされるすべてのエンティティで、同じキャッシング・スキームを使用できます。
これにより、様々な名前付きのキャッシュに対して、JPAキャッシング・スキームの使用が指示されます。例1-3は、Employeeクラスのインスタンスをキャッシュする、Employeeという名前のNamedCacheを定義するcoherence-cache-config.xmlのサンプルを示しています。追加クラス用のエンティティ・キャッシュを定義するには、<cache-mapping>要素をさらに追加します。
例1-3 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 scheme defined below -->
<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>
com.tangosol.coherence.jpa.JpaCacheStoreエンティティを使用する場合、エンティティの挿入または更新の際にエンティティが変更されないことを確認するには、永続性ユニットを構成する必要があります。JPAプロバイダによるエンティティへの変更は、いずれもCoherenceキャッシュには反映されないため、キャッシュ内のエンティティはデータベースの内容と一致しなくなります。特に@GeneratedValueなど、エンティティがIDの取得にID生成を使用しない場合、オブジェクトがCoherenceに置かれる前にアプリケーション・コードでIDを割り当てる必要があります。通常、IDはCoherenceに格納されるエンティティが属するキーになります。
オプティミスティック・ロック(@Versionなど)は、データベース・トランザクションのコミットに失敗する可能性があるため使用しないでください。CacheStoreの使用方法およびデータベース・スキーマの設定方法の詳細は、『Oracle Coherenceスタート・ガイド』の「リードスルー、ライトスルー、ライトビハインドおよびリフレッシュアヘッド・キャッシュ」および『Oracle Coherence開発者ガイド』の「CacheStoreのサンプル」を参照してください。
com.tangosol.coherence.jpa.JpaCacheStoreまたはcom.tangosol.coherence.jpa.JpaCacheLoaderを使用する場合、永続性ユニットのL2キャッシュを無効にする必要があります。プロバイダについてはドキュメントを参照してください。TopLinkでは、各エンティティに@Cache(shared=false)と指定するか、デフォルトとしてpersistence.xmlの次のプロパティに指定できます。
<property name="eclipselink.cache.shared.default" value="false"/>