Hitachi

Cosminexus V11 アプリケーションサーバ 機能解説 互換編


8.2.3 CJPAプロバイダを使用するための前提条件

ここでは,CJPAプロバイダを使用するための前提条件について説明します。

〈この項の構成〉

(1) 使用できるコンポーネント

CJPAプロバイダを利用するコンポーネントは,EJBの場合はEJB 3.0以降,Webコンポーネントの場合はServlet 2.5以降となります。

アプリケーションサーバでは,EJB,WebアプリケーションでJPAを使用できます。また,Webアプリケーションからユーザスレッドを使用した場合も,JPAを使用できます。なお,次に示す環境またはライブラリではJPAを使用できません。

JPAを使用できるコンポーネントを次の表に示します。

表8‒3 JPAを使用できるコンポーネント

コンポーネント

JPAの使用

EJB

Stateless Session Bean(EJB3.0以降)※1

Stateful Session Bean(EJB3.0以降)※1

Stateless Session Bean(EJB3.0より前)

×

Stateful Session Bean(EJB3.0より前)

×

インターセプタ

Message-driven Bean

×

Entity Bean

×

Webアプリケーション

サーブレット,フィルタ,イベントリスナ(Servlet2.5以降)

JSP,JSPのタグハンドラ,JSPのイベントリスナ,JSPのタグライブラリイベントリスナ※2(Servlet2.5以降)

サーブレット,フィルタ,イベントリスナ(Servlet2.5より前)

×

JSP,JSPのタグハンドラ,JSPのイベントリスナ,JSPのタグライブラリイベントリスナ(Servlet2.5より前)

×

(凡例)○:使用できる ×:使用できない

注※1 アプリケーションサーバではEJB3.0のejb-jar.xmlを使用したJPAの定義はできません。このため,@PersistenceUnitや@PersistenceContextなどのアノテーションを使用して,永続化ユニットや永続化コンテキストの参照を定義してください。

注※2 アプリケーションサーバでは,JSPタグライブラリイベントリスナでのアノテーションの使用はできません。JSPタグライブラリイベントリスナでJPAの機能を使用する場合は,web.xmlの<persistence-unit-ref>タグや<persistence-context-ref>タグを使用して永続化ユニットや永続化コンテキストの参照を定義してください。

注意事項

Servlet 2.5以降のweb.xmlのmetadata-complete属性にtrueが設定されている場合,Webコンポーネントのアノテーションが読み込まれません。このため,アノテーションを使用して,永続化コンテキストまたは永続化ユニットの参照を定義することはできません。ただし,web.xmlに参照を定義することはできます。

(2) 接続できるデータベース

CJPAプロバイダを使用する場合,次に示すデータベースに接続できます。

(3) 使用できるDB Connector

CJPAプロバイダは,DB Connectorを使用してデータベースを更新します。CJPAプロバイダでは次の表に示すDB Connectorを使用できます。

表8‒4 CJPAプロバイダで使用できるDB Connector

使用するデータベース

トランザクションタイプ

使用できるDB Connector

Oracle

LocalTransaction

NoTransaction

DBConnector_Oracle_CP.rar

XATransaction

DBConnector_Oracle_XA.rar

Oracle RAC

LocalTransaction

NoTransaction

DBConnector_Oracle_CP.rar

DBConnector_CP_ClusterPool_Root.rar

DBConnector_Oracle_CP_ClusterPool_Member.rar

HiRDB

LocalTransaction

NoTransaction

DBConnector_HiRDB_Type4_CP.rar

XATransaction

DBConnector_HiRDB_Type4_XA.rar

(4) 使用できない環境

次の環境ではCJPAプロバイダを使用できません。

(5) メソッドキャンセル機能の使用について

CJPAプロバイダでは,OneToOneおよびManyToOneのLAZYフェッチの場合,アクセサメソッドに独自のバイナリコードを埋め込みます。これによって,アクセサメソッドがメソッドキャンセルの対象になります。このため,OneToOneリレーションシップ,またはManyToOneリレーションシップでLAZYフェッチが指定されている場合は,エンティティクラス,埋め込み可能クラス,およびマップドスーパークラスを保護区に登録する必要があります。

なお,保護区に登録しない場合は,埋め込んだバイナリコード上でメソッドキャンセルが起こるおそれがあります。保護区に登録しない場合の動作は保証しません。

保護区に登録されている場合でも,登録されていない場合でも,メソッドタイムアウトで下記のようなスタックトレースが出力されます。ただし,保護区に登録しているとメソッドキャンセルは発生しません。

次に示す例では,ユーザが呼び出したEntityClass1.getMappingClass2メソッドの延長で,埋め込んだEntityClass1._toplink_getmappingClass2が呼ばれています。そこでメソッドタイムアウトが発生していますが,メソッドキャンセルは発生しません。

message-id       message(LANG=ja)
KDJE52703-W      A timeout occurred while the user program was executing. (threadID = 23794987, rootAPInfo = 10.209.11.124/5964/0x4828eb62000128e0, application = JPA_JavaEE_TP, bean = TestBean, method = doTest)
    jpa.test.annotation.onetoone.entity.EntityClass1._toplink_getmappingClass2(EntityClass1.java)
                       locals:
                         (jpa.test.annotation.onetoone.entity.EntityClass1) this = <0x11e35878> (jpa.test.annotation.onetoone.entity.EntityClass1)
                        at jpa.test.annotation.onetoone.entity.EntityClass1.getMappingClass2(EntityClass1.java:34)
                       locals:
                         (jpa.test.annotation.onetoone.entity.EntityClass1) this = <0x11e35878> (jpa.test.annotation.onetoone.entity.EntityClass1)

保護区への登録については,マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「2.2.5 criticalList.cfg(保護区リストファイル)」を参照してください。

(6) アノテーションの参照抑止機能の使用について

CJPAプロバイダを使用する場合,アノテーションの参照抑止機能は使用できません。アノテーションの参照抑止機能が有効になっていると,永続化コンテキストおよび永続化ユニットの参照を定義できません。