WebSphere Application Server V6.1でのOpenJPAの活用

Apache OpenJPA プロジェクトは、JPA 仕様の堅固で高性能かつスケーラブルな実装の実現を中心とした、Java™ Persistence API オープン・ソース実装です。この記事では、IBM WebSphere Application Server V6.1 を使用して OpenJPA のいくつかの機能を活用する完全な例を用いて、OpenJPA を説明します。

IBM WebSphere Developer Technical Journalより。

Roland Barcia, Certified IT Specialist, IBM

Roland Barcia は、ニューヨーク/ニュージャージー首都圏の IBM Software Services for WebSphere で認定 IT スペシャリストとして活躍しています。「IBM WebSphere: Deployment and Advanced Configuration」の共著者です。Roland についての詳しい情報は、彼の Web サイトにアクセスしてください。


developerWorks マスター著者レベル 2

Kevin Sutter, Senior Software Engineer, IBM

Kevin Sutterは、WebSphere Application Server開発グループのSenior Software Engineerです。現在、WebSphereの Java Persistence API実装作業のリーダーを務めています。Kevinはこれまでに、J2EE Connector Architecture(JCA)および ObjectGrid(キャッシング・フレームワーク)向けWebSphereソリューション開発を指揮し、このソリューションの設計を担当しています。



2006年 10月 26日

はじめに

EJB 3.0仕様では、EJBプログラミング・モデルが大幅に改良されました(これを「必要な改良」と言う人もいます)。アノテーション付きPOJO(plain old Java object)の使用に重点を置いており、EJBプログラミング・モデル全体がこれまでの EJB仕様とは大きく異なっています。この新たなプログラミング・モデルで多くの注目を集める点の1つに、パーシスタンス・アーキテクチャーがあります。この記事では、WebSphere Application Server V6.1を使用してこれらの一部の機能を活用する完全な例を用いて、この新しいJava Persistence APIを紹介します。


JPAの概要

Java Persistence API(JPA)は、Java EE 5 EJB 3.0(EJB 3)仕様の一部です。EJB 3エキスパート・グループにより次の3つの仕様が策定されています。

  • EJB Core Contracts and Requirements
  • EJB 3.0 Simplified API
  • Java Persistence API.

JPA仕様では、Java EE環境およびJava SE環境の両方におけるパーシスタンスおよびオブジェクト/リレーショナル・マッピングの管理が定義されます。
要約すると、JPA仕様では次の主要領域がカバーされています。

  • 新しいPOJOベースのプログラミング・モデルが導入されました。このプログラミング・モデルは、Java EE環境およびJava SE環境の両方に同等に適用されます。XMLベースのメカニズムに加え、アノテーションを使用して、アプリケーション・コードにメタデータを直接定義できるようになりました。エンティティー POJOがEJBフレームワーク・ベースのインターフェースを実装する必要がなくなりました。
    • このプログラミング・モデルでは、POJO(エンティティー)オブジェクトの分離モデルも定義されています。これは、クライアント/サーバー環境とWebアプリケーション環境で役立ちます。
    • このプログラミング・モデルでは、EJB照会言語(JPQLとも呼ばれる)が拡張され、また、ネイティブSQL照会が使用可能になりました。
  • 旧リリースではベンダー固有のオブジェクト/リレーショナル(O/R)マッピングに依存していましたが、JPA仕様ではオブジェクト/リレーショナル(O/R)マッピングが明示的に定義されています。これにより、ベンダーの変更とアプリケーションの移行が容易になります。
  • パーシスタンスに関連する項目がいくつか標準化されました。
    • オプティミスティック並行性制御のためのオブジェクト・バージョン管理
    • データベース・キー生成
    • フィールドのlazy loadingとeager loading
    • 継承

この単純化には、わずかながらデメリットがあります。プログラム・モデルの大幅な変更により、既存のEJB 2.x アプリケーションで新しいJPA機能を利用するには、アプリケーションを再作成する必要があります。また、新しいJPA仕様には、自動コンテナー管理リレーションシップ(CMR)保守が含まれていません。リレーションシップの維持はアプリケーションにより管理されます。

Java Persistence APIに関する詳細情報は、各種ホワイトペーパー、記事、プレゼンテーション、および書籍、SunのWebサイトにあります(「参考文献」を参照)。


OpenJPAの紹介

Apache OpenJPAプロジェクトは、Apacheライセンスの元で提供されるJava Persistence APIのオープン・ソース実装です。OpenJPAは、JPA仕様の堅固で高性能かつスケーラブルな実装の実現を中心としています。

オリジナルのソース・コードはBEA®から(SolarMetric Kodo買収を通じて)提供されていますが、IBMをはじめさまざまな企業や個人が、ユーザー、コントリビューター、またはコミッターとしてOpenJPAプロジェクトに参加しています。OpenJPAコミュニティーは今後さらに発展し、近い将来インキュベーション段階から昇格することが期待されています。(訳注:OpenJPAは2007年5月にインキュベーションを卒業し、Apacheのトップレベルプロジェクトに昇格しました。)

この OpenJPAプロジェクトに業界の注目が集まっていることを踏まえ、この記事では、WebSphere Application Server環境でOpenJPA実装を直接活用する方法を説明します。


サンプル・アプリケーションについて

サンプルとして、顧客発注システムを使用します。このシステムでは、顧客が注文を作成し、明細を追加し、注文を送信します。このサンプル・システムのユースケースを図1に示します。

図1. サンプル・アプリケーションのユースケース

図2のアクティビティー・ダイアグラムは、ユースケースの実行順序を示します。

図2. サンプル・アプリケーションのユースケースの実行順序

この例では、WebSphere Application Server V6.1でOpenJPAをパーシスタンス・レイヤーとして使用する方法を示すことを目的としているため、パーシスタンス・レイヤーのみに焦点を当てています。

図3. データベースのデータ・モデル

サンプル・データベースには次の4つの表があります。

  • CUSTOMER :
  • ORDER :
  • LINEITEM :
  • PRODUCT :

サンプル・アプリケーションには、これらの表に対応する4つのJPAエンティティーがあります。図4のクラス・ダイアグラムにこれを示します。

図4. クラス・ダイアグラム

マッピングについて特に留意すべき点を以下に示します。

  • CustomerエンティティーとCustomerOrderのリレーションシップは一方向1対1ですが、OrderとCustomerの関係は一方向の多対1の関係です。
    OrderとCustomerの関係が両方向でない理由は、Customerが現在未出荷の注文のインスタンスのみを維持するためです。ただしOrder Tableには、注文の状態に関係なく、Customerのすべての注文が格納されています。一方向の関係であり、両サイドを設定する必要があるため、これはリレーションシップのセットアップ方法に影響します。
  • CustomerOrderとLine Itemのリレーションシップは、双方向、つまり管理対象リレーションシップです。

ユースケースの表現にはEJBセッション・ファサード・レイヤーを使用します。
WebSphere Application Server V6.1ではEJB 2.1がサポートされているため、EJB 2.1セッションBeanを使用します。ただし、将来EJB 3をサポートできるようにするため、すべてのファサード・ロジックをPOJOに移行しています。これにより、EJB 3セッションBeanへの移行時に行う作業が、EJB 2.1セッションBeanレイヤーを削除してPOJOにアノテーションを付けるだけになります。図5は、セッションBeanと対応するPOJOのクラス・ダイアグラムです。

図5. セッションBeanとPOJOのクラス・ダイアグラム

フローを示すため、Find Customerユースケースの実装をシーケンス・ダイアグラムに示します。すべてのファサード・ロジックはOrderProcessor POJOで実行されます。Order ProcessorがJPAエンティティー・マネージャーおよびJPA POJOと対話し、パーシスタンス・コードを実行します。EJB 2.1セッションBeanはPOJOに処理を委任します。コードについては後述します。

図6. シーケンス・ダイアグラム

同様に、Open Order実装を図7に示します。すべてのユースケースは、EJB 2.1セッションBeanのこの基本フローに従い、ファサードPOJOを呼び出します。呼び出されたファサードPOJOは、JPAエンティティー・マネージャーと対話します。

図7. Open Orderの実装

拡大図


Application Server Toolkitを使用したJPA開発環境のセットアップ

WebSphere Application Server V6.1でOpenJPAを使用するには、以降のビルドを入手してください。以前のビルドでは、OpenJPAがトランザクション・サポートにアクセスするために内部WebSphere Application Server APIを誤った方法で使用していました。10/26以降のビルドでは、OpenJPAは公開されている正しいAPIを使用しています。

この記事のサンプルを実行するには、この記事の終わりに示されているデータをダウンロードする必要があります。

OpenJPAビルドの入手
最新のOpenJPAビルドを入手するには、openjpa-0.9.6-incubating.zipファイルをダウンロードします。OpenJPAをダウンロードするその他の方法についての詳細は、「参考文献」を参照してください。(訳注:本記事は翻訳元記事執筆時点での最新バージョンを元に記述されています。)

ダウンロードしたファイルは任意の場所に解凍できます。図8に示すように、ZIPファイルのルートにOpenJPA実装JARファイルがあります。

図8. OpenJPA実装JARファイル

libディレクトリーに、必要な依存ライブラリが含まれています。

図9. 依存JARファイル

EARにこれらのJARファイルをパッケージする方法については後述します。

ワークスペースのセットアップ
WebSphere Application Server V6.1にはApplication Server Toolkit(AST)V6.1が付属しています。ASTは、Eclipse Web Toolsプロジェクトのスーパーセットであり、WebSphere Application Server固有の機能(WebSphere Application Serverテスト・サーバーなど)を追加します。このセクションでは、OpenJPAをスムーズに開発できるようにASTをセットアップする方法を説明します。

  1. Application Server Toolkitを開始します。
    1. 空のワークスペースを開きます。
      図10. ワークスペースの起動
    2. 「Welcome」画面を閉じます。
      図11. AST Welcome
    3. J2EEパースペクティブに切り替えます。
      図12. J2EEパースペクティブの選択
  2. まず最初に、WebSphere Application Server V6.1を単体テスト環境としてセットアップする必要があります。ここで、ローカル・シングル・サーバーとして WebSphere Application Server V6.1が既にインストールされていることを前提とします。また、プロファイルが既に作成されていることも前提とします。(インストールとプロファイルの詳細については、「参考文献」を参照してください。)
    1. 「Servers」ビューに移動し、ビュー内を右クリックします。
    2. New => Serverを選択します(図13)。
      図13. 新規サーバーの作成
    3. 「IBM」=>「WebSphere v6.1 Server」を選択して「Create New runtime」を選択し、「Next」をクリックします(図14)。
      図14. 新規ランタイムの作成
    4. 「Name」のデフォルト値をそのまま使用し、WebSphere Application Server V6.1のインストール・ディレクトリーを指定し、「Next」をクリックします。
      図15. 新規ランタイムの定義
    5. 適切なポート番号のアプリケーション・サーバー・プロファイルを選択します。この例では、保護プロファイルを使用します。この場合、管理ユーザーIDとパスワードを入力する必要があります。「Finish」をクリックします。
      図16. 新規サーバーの定義
  3. ASTが、デフォルトでJava 1.4 JDKとJREを使用するようセットアップされていることがあります。JPAではJava 5のアノテーションと機能が使用されるので、Java 5コードをコンパイルできるようにするため、プリファレンスを更新する必要があります。
    1. メインメニューで「Window」を選択し、「Pereferences」を選択します。
      図17. 設定の変更
    2. 「Java」セクションを展開し、「Compiler」を選択します。
    3. 「Compiler compliance level」を5.0に変更して、「Apply」をクリックします。
      図18. コンパイラーの準拠レベルの変更
    4. 「Installed JREs」に切り替え、「WebSphere Application Server v6.1 JRE」を選択します。
      図19. JREの切り替え
    5. 「OK」をクリックして変更を保存し、次に「Yes」をクリックしてビルドを実行します。
      図20. コンパイラー設定の変更とビルド

Java EE プロジェクトの作成
このセクションでは、各種Java EEプロジェクトの作成方法と、JPAを格納するEARファイルのセットアップ方法を説明します。

  1. Enterprise Application Projectと対応するサブプロジェクト(EJBプロジェクトとWebプロジェクト)を作成するには、Project Explorerで「Enterprise Applications」を右クリックし、「New」=>「Enterprise Application Project」を選択します。
    図21. Enterprise Application Projectの作成
  2. 「Project Name」にOpenJPATestEARと入力し、「Target runtime」でWebSphere Application Server v6.1を選択します(図22)。「Next」をクリックします。
    図22. Enterprise Application Projectの定義
  3. 「Select Project Facets」ページのデフォルト設定を受け入れ、「Next」をクリックします(図23)。
    図23. プロジェクト・ファセットの選択
  4. 「New Module...」をクリックし、新規J2EEモジュール・ウィザードを開始します(図24)。
    図24. 新規J2EEモジュール・ウィザードの開始
  5. EJBプロジェクトとWebプロジェクトを以下の名前で作成します(図25)。
    • EJB モジュール: OpenJPATest
    • Web モジュール: OpenJPATestWeb
    「Finish」をクリックします。
    図25. デフォルトJ2EEモジュールの作成
  6. 作成したモジュールがプロジェクト・ウィンドウに表示されます。「Finish」をクリックします。EARプロジェクトの作成が完了します(図26)。
    図26. EARプロジェクト作成完了

必要な成果物がすべて作成され、必須従属ファイルがインポートされるまでは、コンパイル・エラーが発生する可能性がある点に注意してください。
DB2データベースおよびWebSphere Application Serverデータベース構成のセットアップ
アプリケーションを実行するにはデータベースをセットアップする必要があります。この記事の例ではDB2®バージョン9を使用しており、表DDLスクリプトとテスト・データが既に用意されています。使用するデータベースによっては、スキーマを変更する必要があります。(あるいは、OpenJPA資料を参照してご使用のデータベースに対応したDDLを生成することもできます。詳しくは「参考文献」を参照してください。)

  1. 提供されるダウンロード・ファイルのOrderEntryDBフォルダーで必要なスクリプトを見つけます。
  2. DB2コマンド・ウィンドウでこれらのスクリプトを実行します。DB2コマンド・ウィンドウを表示するには、「IBM DB2」=>「Command Line Tools」=>「Command Window」の順に選択します。
    1. DB2データベースを作成するため、次のようなDB2コマンドを入力します。
      db2 create db JPATEST
    2. データベースが作成されたら、データベースに接続するため、同じコマンド・ウィンドウから次のようなコマンドを入力します。
      db2 connect to JPATEST user db2admin using db2admin
    3. ダウンロード・ファイルに含まれているDDLスクリプトを実行するため、次のコマンドを実行します。
      db2 -tvf C:\<directory>\createTables.DDL
    4. 同様の方法でデータ作成スクリプトも実行できます。
      db2 -tvf C:\<directory>\createData.sql
  3. この記事の例では、例を単純にするため、WebSphere Application Serverの拡張EAR機能を使用しています。この機能では、アプリケーションにデータベース構成を保存できます。アプリケーションのインストールが完了すると、WebSphere Application Serverはこの情報を使用して適切な構成を作成します。これにより、アプリケーション・サーバーに必要なJDBCドライバーとDataSourceの構成にかかる時間が短縮されます。

    (拡張EAR機能は迅速なプロトタイピングのために使用される機能ですが、さまざまなテスト環境や実稼働環境でアプリケーションを適切に管理できるようにするため、wsadminスクリプト(または管理コンソール)を使用してサーバー上で必須リソースを構成しておくことをお勧めします。)
    1. データベース構成をアプリケーションに追加するため、EARプロジェクトでapplication.xmlファイルを開きます。このファイルを開くには、図27に示すOpenJPATestEARデプロイメント記述子アイコンをダブルクリックします。
      図27. EARプロジェクトを開く
    2. 「Deployment」タブを選択します。図28では、該当する構成アイテムが強調表示されています。
      図28. デプロイメント記述子の構成
    3. この図からわかるように、構成パネルにはさまざまなセクションがあります。値を入力するには、「Add」をクリックして、特定の構成アイテムのウィザードを起動します。各セクションで入力または選択する値を以下にまとめます。
      JDBC Driver used:
      • 画面1:
        • Database type: IBM DB2
        • JDBC provider type: DB2 Universal JDBC Provider (XA)
          (必ずタイプ 4 Universal Driverを使用してください。このドライバーは、必要とされるJDBC 3.0 APIを使用します。)
      • 画面2:
        • Name: DB2XA
        • Implementation class name: com.ibm.db2.jcc.DB2XADataSource
        • Accept default Class path and Native path

      DataSource used:
      • 画面1:
        • Provider Type: DB2 Universal JDBC Driver Provider (XA)
        • Version 5.0 data source
      • 画面2:
        • Name: OrderDS
        • JNDI Name: jdbc/orderds
        • Container-managed authentication alias: DBUser
      • 画面3:
        • Database Name: JPATEST

      Authentication Alias:
      • Alias: DBUser
      • User id: <<データベース ID>>
      • Password: <<パスワード>>
      Substitution Variables:
      • DB2UNIVERSAL_JDBC_DRIVER_PATH: <<DB2 Root>>/java
      • 例: C:\Progra~1\IBM\SQLLIB\java

エンタープライズ・アプリケーションへのJPA JARファイルの追加
OpenJPA JARと依存ファイルをEARファイルに追加するため、Enterprise Application ProjectのEarContentファイルにこれらをインポートする必要があります。

  1. 最初に依存JARファイルを追加します。
    1. OpenJPATestEARプロジェクトの中のEarContentフォルダーを右クリックし、次に示すように「Import...」を選択します。
      図29. JARファイルのインポート
    2. 「File system」を選択し、「Next」をクリックします(図30)。
      図30. ファイル・システムの選択
    3. 「From directory」フィールドで、JPAをダウンロードしたディレクトリーの中のlibディレクトリーに移動します。次のJARファイルを選択します(図31)。
      • common-collections-3.2.jar
      • common-lang-2.1.jar
      • commons-pool-1.3.jar
      • persistence-api-1.0.jar
      • serp-1.11.0.jar

      (その他の従属JARファイルは不要です。WebSphere Application Serverには、必要なJ2EE JARと共通ロギング機能があります。また、この例ではDB2を使用するため、DerbyランタイムJARも不要です。)
      「Finish」をクリックします。
      図31. インポートするJARファイルの選択
  2. 次に、JPA実装JARファイルをインポートする必要があります。前のステップと同様に、JPAインストール・ディレクトリーのルートに移動し、インポートするJARファイルとしてopen-all-0.9.6-incubating.jarを選択し、「Finish」をクリックします。
    図32. JPA実装JARファイルのインポート
  3. EJBプロジェクトがJARファイルを検出できるようにするため、EJBプロジェクトのクラスパスを更新します。
    1. EJB ProjectsフォルダーのOpenJPATestプロジェクトを右クリックし、「Properties」を選択します(図33)。
      図33. プロジェクト・プロパティーの表示
    2. 出力ディレクトリーをソース・ディレクトリーと同一に変更します。これにより、JPAエンハンスメントステップが正しく機能します。このように出力ディレクトリーを変更するには、「Java Build Path」項目を選択し、デフォルト出力フォルダーを「OpenJPATest/ejbModule」に変更します(図34)。
      図34. 出力ディレクトリーとソース・ディレクトリーを同一にする
    3. 「J2EE Module Dependencies」に切り替え、図35に示すようにすべてのJARを選択します。
      図35. すべての従属JARファイルの選択
  4. これで、プロジェクトのJavaソースをインポートできます。
    1. OpenJPATestプロジェクトの中のejbModuleフォルダーを右クリックし、「Import」を選択します。
    2. 「File system」を選択し、「Next」をクリックします。
    3. ダウンロードしたファイルをディレクトリーに解凍し、ダウンロード・ディレクトリーの中のejbModuleフォルダーを入力します(図36)。
      図36. ダウンロードしたリソースのインポート
    4. 上書きするかどうかの確認を求められたら、「Yes To All」を選択します。

Eclipseビルドにエンハンスメントを追加する
OpenJPAは、バイトコードエンハンスメントを使用して、パーシスタンス動作をJPAオブジェクトに追加します。クラスをエンハンスする方法は複数あります(「参考文献」を参照)。この記事の例では、エンハンサーを実行する単純なANTスクリプトを利用します。開発プロセスを単純にするため、AntビルドをEclipseビルドに組み込みます。これにより、Eclipseでクラスをコンパイルすると、JPAエンハンサーがビルドの一部として実行されます。これにより、開発プロセスが簡素化されます。

  1. ANTスクリプトは、OpenJPAエンハンサーツールを使用する単純なスクリプトです。ejbModuleディレクトリーのルートにあるbuild.xmlファイルを開きます。ANTファイルは、persistence.xmlファイルとエンティティーのパッケージを指し示しています。(persistence.xmlファイルについては次のセクションで説明します。)
    図37. build.xmlファイルを開く
    リスト1
    <project name="enahnceJPA">
    <target name="enhance">
      <!-- define the openjpac task; this can be done at the top of the    -->
      <!-- build.xml file, so it will be available for all targets      -->
      <taskdef name="openjpac"
    classname="org.apache.openjpa.ant.PCEnhancerTask"/>
    
      <openjpac>
            <config propertiesFile="./META-INF/persistence.xml"/>
        <fileset dir=".">
        <include name="**/com/ibm/persistence/ejb3/order/entity/*.java" />
        </fileset>
      </openjpac>
    </target>
    
    </project>
  2. Eclipseビルドの一部としてエンハンサーを実行するには、ビルダーを構成する必要があります。
    1. OpenJPATest EJBプロジェクトを右クリックして「Properties」を選択します。
      図38. プロジェクト・プロパティーの表示
    2. 「Builders」セクションで「New」をクリックし、「Ant Build」を選択します(図39)。
      図39. Antビルドの構成
    3. ビルダーにJPAEnhanceという名前を指定します。
    4. 「Main」タブでワークスペースを参照し、ejbModuleディレクトリーの中にあるbuild.xmlファイルを選択します。
    5. 「Arguments」タブで「-verbose -debug」フラグを追加します。最終的な構成は図40のようになります。
      図40. ビルダーの構成
    6. エンハンスメントが完了したらワークスペース全体をリフレッシュするため、「Refresh」タブで「Refresh resources upon completion」を選択します(図41)。
      図41. Refresh workspace upon completion
    7. 「Targets」タブに切り替え、「Manual Build」と「Auto Build」でエンハンスメントタスクを選択します(図42)。
      図42. 拡張タスクの選択
    8. すべてのJPA JARを追加するため、「Classpath」タブ(図43)で「Add JARs」をクリックし、ワークスペースを参照してEARファイルを選択し、すべてのEARコンテンツを追加します。
    9. また、ejbModuleディレクトリーをビルドのクラスパスに追加する必要があります。この追加操作は、「Add Folders...」を選択して実行します。
    10. 最後に、WebSphere Application Serverインストール・ディレクトリーの中のlibディレクトリーにあるj2ee.jarファイルを追加します。この追加操作は、「Add External JARs...」を選択して実行します。
      図43. 構成へのJARファイルの追加
    11. 「OK」をクリックします。ビルダーが保存されます。
    12. ビルドではJPAEnhanceタスクが最後に実行される必要があります(図44)。自動ビルドに設定している場合は、エンハンサーが実行されるはずです(図45)。エンハンスメントが正常に実行された場合の出力の例を図46に示します。
      図44. ビルド・タスク

      図45. 自動ビルドの有効化

      図46. 正常に実行されたエンハンスメントの出力

サンプル・アプリケーションについて
これでデータベース、サーバー、およびワークスペースの構成が完了しました。次に、アプリケーションについて説明します。アーキテクチャーについては既に概説しているためパッケージングにのみ触れ、OpenJPAの構成について説明します。

  1. Project Explorer でejbModuleフォルダーを展開し、すべてのパッケージを表示します。図47に、各パッケージの位置を示します。
    1. JPAエンティティー・パッケージには、アノテーション付きJPAエンティティー・オブジェクトが含まれています。
      図47. すべてのejbModuleパッケージ
    2. エンティティーを確認します。Customer Entityオブジェクトをリスト2に示します。このオブジェクトをパーシスタンス対応にするには、以下のクラスに示すように、アノテーションを追加します。

      リスト2
      package com.ibm.persistence.ejb3.order.entity;
      
      import java.io.Serializable;
      import javax.persistence.*;
      
      @Entity
      @Table(name="CUSTOMER", schema="CUSTSCH")
      public class Customer implements Serializable {
      
              
              private Integer id;
              private String name;
              private CustomerOrder currentOrder;
                      
              @Id
              @Column(name="CUST_ID")
              public Integer getId() {
                      return id;
              }
              public void setId(Integer id) {
                      this.id = id;
              }
              
              @Column(name="NAME")
              public String getName() {
                      return name;
              }
              public void setName(String name) {
                      this.name = name;
              }
              
              
               @OneToOne(fetch=FetchType.EAGER,cascade = 
      {CascadeType.MERGE,CascadeType.REFRESH},optional=true )
               @JoinColumn(name="OPEN_ORDER_ID",referencedColumnName="
      ORDER_ID") 
              public CustomerOrder getCurrentOrder() {
                      return currentOrder;
              }
              public void setCurrentOrder(CustomerOrder currentOrder) {
                      this.currentOrder = currentOrder;
              }
      
      }
    3. また、OrderProcessorBeanが含まれているPOJOファサード・パッケージもあります。このPOJOパッケージは、エンティティーへのアクセスおよびエンティティーの更新にJPAを使用します。
      OrderProcessorBeanの一部をリスト3に示します。コンストラクターで、2つのEntityManagerFactoryを取得している点に注意してください。この理由については次のセクションで説明します。

      リスト3
      public class OrderProcessorBean implements OrderProcessor {
      
              private EntityManagerFactory emf;
              
              private EntityManagerFactory emfPessLock;
              
              
              
              public OrderProcessorBean() {
                      emf = 
      EntityManagerFactoryHelper.getEntityManagerFactory("OrderDB");
                      emfPessLock = 
      EntityManagerFactoryHelper.getEntityManagerFactory
      ("OrderDBPessLock");
              }
      
              public Customer findCustomerById(int customerId) throws 
      CustomerDoesNotExist{
                      //1. Finds customers by ID.  
                      EntityManager em = emf.createEntityManager();
                  Customer customer =   findCustomerByIdInternal(customerId,em);
                      em.close();
                      return customer;
              }


      (例ではアプリケーション管理エンティティー・マネージャーを使用しています。つまり、エンティティー・マネージャーを呼び出しコードに注入することはできません。代わりに、EntityManagerFactoryをロードする必要があります。また、EntityManagerを使用した処理が完了したら、必ずEntityManagerを閉じる必要があります。これについては、次のセクションで説明します。)
  2. persistence.xmlは、JPAエンティティーとデータベースの必要な構成が含まれているパーシスタンス・ユニットを定義する記述子です。
    1. persistence.xmlを開いて内容を確認します。
      図48. persistence.xmlを開く
    2. persistence.xmlをリスト4に示します。2つの異なるパーシスタンス・ユニットがある点に注意してください。OrderProcessorクラスが2つのEntityMangerFactoryを使用することを前のセクションで説明しました。読み取りアクセス・パターンと書き込みアクセス・パターンの両方があるため、それぞれのタイプごとにEntityMangerFactoryを1つずつ (オプティミスティック読み取りに1つ、ペシミスティック更新に1つ)定義する必要があります。さまざまなプロパティーが定義されています。
      • JPAプロバイダー:この場合は OpenJPA。
      • jta データ・ソース:この場合は、呼び出しセッションBeanで定義されているリソース参照。
      • トランザクション:managed。これにより、OpenJPA が、下位に存在するEJBコンテナーにトランザクションを委任できます。
      • 接続ファクトリー・モード:managed。これにより、アプリケーション・サーバーが接続アクセスを管理できます。
      • ディクショナリー・プロパティー:DB2照会への変換を有効にします。DB2以外のデータベースを使用している場合は、適切な値に変更する必要があります(対応データベースについては、「参考文献」の OpenJPA資料を参照してください)。
      • ロック・マネージャー・プロパティー:2つめのパーシスタンス・ユニットでは、ロックがペシミスティックに設定されます。これにより、例えば、OpenJPAは適切な場合に、“Select for update” を使用できます。

      リスト4
      <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
                  http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
              version="1.0">
      <persistence-unit name="OrderDB">
              <provider>
                      org.apache.openjpa.persistence.PersistenceProviderImpl
                      </provider>
                      <jta-data-source>
                              java:comp/env/jdbc/orderds
                      </jta-data-source>
                      <properties>
                      <property name="openjpa.TransactionMode" 
                              value="managed"/>
                      <property name="openjpa.ConnectionFactoryMode" 
                              value="managed"/>
                      <property name="openjpa.jdbc.DBDictionary" 
                              value="db2"/>
              </properties>
              </persistence-unit>
              <persistence-unit name="OrderDBPessLock">
              <provider>
              org.apache.openjpa.persistence.PersistenceProviderImpl
              </provider>
              <jta-data-source>java:comp/env/jdbc/orderds</jta-data-source>
              <properties>
              <property name="openjpa.TransactionMode" 
                      value="managed"/>
              <property name="openjpa.ConnectionFactoryMode" 
                      value="managed"/>
              <property name="openjpa.jdbc.DBDictionary" 
                      value="db2"/>
              <property name="openjpa.LockManager"
                  value="pessimistic(VersionCheckOnReadLock=true,VersionUpdate
                  OnWriteLock=true)"/>
              </properties>
      </persistence-unit>
      </persistence>

次の2つのEM構成タイプがあります。

  • JTA構成タイプ。この構成タイプは、トランザクション・サービスからの直接のトランザクション・イベント(begin/commit/rollback)をリスンします。
  • リソース・ローカル・タイプ。この構成タイプは、EntityTransactionインターフェースを呼び出すアプリケーションからこれらのイベントを把握します。

WebSphere Application Server V6.1でOpen JPAを実行することで、上記の構成を使用したJTAトランザクションの処理が可能になります。ただし、JPAではコンテナー管理エンティティー・マネージャーとアプリケーション管理エンティティー・マネージャーの概念が定義されています。この2つのエンティティー・マネージャーの相違点を理解するには、まずパーシスタンス・コンテキストを理解する必要があります。

パーシスタンス・コンテキストとは、管理対象エンティティー・インスタンスの集合であり、各永続エンティティーを識別する固有のエンティティー・インスタンスが存在しています。パーシスタンス・コンテキストでは、エンティティーと対応するパーシスタンス・ストアとの関連付けが、エンティティー・マネージャー(EM)により管理されます。

コンテナー管理EMインスタンスを作成するには、コンテナーに対し、(直接注入またはJNDIルックアップのような注入により)1つのインスタンスを注入するように指示します。そのEMインスタンスの存続期間は、コンテナーにより制御されます。インスタンスは、注入先コンポーネントの存続期間に対応します。コンテナー管理EMインスタンスごとに、対応するコンテナー管理パーシスタンス・コンテキスト(PC)が1つ以上存在します。PCの作成時に、現在有効なトランザクションにPCがリンクされます。また、コンテナーにより、同じJVM内で呼び出されている他のコンポーネントに、トランザクション・コンテキストとともに伝搬されます。コンテナー管理EMインスタンスの使用シナリオは、さらにトランザクション・スコープ(存続期間がトランザクションにより制御される)と拡張(存続期間が1つ以上のステートフル・セッションBeanインスタンスにより制御される)に分類されます。

アプリケーション管理EMインスタンスを作成するには、EntityManagerFactoryを呼び出します(インスタンス自体を注入するか、またはJNDIで検索されます)。このインスタンスの存続期間は、アプリケーションにより制御されます。アプリケーション管理EMインスタンスごとに、対応するアプリケーション管理パーシスタンス・コンテキストが1つ以上存在します。これらのパーシスタンス・コンテキストは、トランザクションにはリンクされず(分離)、他のコンポーネントに伝搬されません。これは、アプリケーション管理エンティティー・マネージャーをJTAエンティティー・マネージャーとして構成できないということではありません。ただし、エンティティー・マネージャーを開く操作と閉じる操作をユーザー自身が実行する必要がある点を覚えておいてください。

コンテナー管理エンティティー・マネージャーとアプリケーション管理エンティティー・マネージャー(およびそれぞれのパーシスタンス・コンテキスト)は、Java EEバージョン5のWebコンテナーとEJBコンテナーでサポートされている必要があります。EJB環境では一般に、コンテナー管理エンティティー・マネージャーが使用されます。WebSphere Application Server V6.1でOpenJPAを使用する場合、アプリケーション管理エンティティー・マネージャーのみがサポートされます。ただし、前述のとおり、JTAを使用してアプリケーション管理エンティティー・マネージャーを構成できます。WebSphere Application Serverの将来のリリースでは、コンテナー管理エンティティー・マネージャーもサポートされる予定です。コードを適切にレイヤー化することで、EJB 3への移行に伴うコンテナー管理エンティティー・マネージャーへの移行が容易になります。

Webクライアントのインポート
アプリケーションをテストする目的で、所要の順序でユースケースを実行する単純なテスト・サーブレットが用意されています。

  1. まずWebプロジェクトをインポートします。
    1. OpenJPATestWebプロジェクトを右クリックして「Import」を選択します(図49)。
      図49. Webプロジェクトのインポート
    2. 「File System」を選択し、「Next」をクリックします。
    3. 「From directory」フィールドで<<ダウンロード・ファイル>>/WebClientを見つけます(図 50)。「Into folder:」フィールドにWeb プロジェクトのルートが設定されていることを確認します。「Finish」をクリックします。
      図50. ダウンロードしたWebクライアントの参照
    4. 「Yes」をクリックして、デフォルト設定を上書きします。
      図51. デフォルト設定の上書き
  2. 次に、Webプロジェクトのクラスパスを、EJB JARファイルを指し示すように更新する必要があります。
    1. Webプロジェクトを右クリックして「Properties」を選択します(図52)。
      図52. プロジェクト・プロパティーの更新
    2. J2EE Module Dependenciesの中のOpenJPATestEJB.jarファイルを選択し、「OK」をクリックします(図53)。
      図53. JARファイルの選択

Application Server Toolkitを使用したWebSphere Application Server V6.1でのアプリケーションの実行
アプリケーションを実行するには、EARファイルをインストールしてテスト・サーブレットを呼び出します。この操作は、サポートされているWebSphere Application Serverデプロイメント・モデルで実行できます。この記事の例では、Application Server Toolkitから直接テストを実行します。

  1. Application Server Toolkitからアプリケーションをインストールするために必要な操作は、サーバーへのアプリケーションの追加だけです。
    1. 「Server」ビューで「WebSphere v6.1 Server」を右クリックし、「Add and Remove Projects...」を選択します(図54)。
      図54. サーバーへのプロジェクトの追加
    2. 「Available projects」からアプリケーションを選択し、「Add」を選択します。これで、選択したアプリケーションが「Configured projects」に移動します(図55)。「Finish」をクリックします。
      図55. 使用可能なプロジェクトから構成済みプロジェクトへの移動
    3. コンソールで、開始サーバーとアプリケーションの両方をモニターします(図56)。(サーバーが開始しない場合は、右クリックして「Start」を選択します。)
      図56. アプリケーションとサーバーに関するコンソール・メッセージ
  2. アプリケーションが開始したら、サーブレットをテストできます。
    1. 「OpenJPATestWeb」=>「Servlets」=>「JPATester」の順に展開します。「JPATester」を右クリックし、「Run As」=>「Run on Server」の順に選択します(図57)。
      図57. サーブレットのテスト
    2. 「Set server as project default」にチェック・マークを付けます(図58)。(これは、プロジェクトを初めて実行するときにだけ行う操作です。)
      図58. プロジェクトのデフォルトとして設定する
    3. ブラウザーが開き、図59に示すような結果が表示されます。サーブレットが適切に実行されている場合は、注文がない顧客が表示され、注文を新規に作成し、明細を追加し、注文を送信します。
      図59. テスト結果

まとめ

EJB 3ではEJB仕様が大幅に更新され、EJBプログラミングが大幅に単純化されました。Java Persistence API(JPA)は、EJB 3仕様におけるパーシスタンス・プログラミングの主要な拡張です。OpenJPAにより、WebSphere Application ServerプラットフォームでJPAを使用できます。サンプル・アプリケーションを実際に構成して実行してみると、いかに簡単に新しい開発プロジェクトでJPAの使用を開始できるかを実感できます。


謝辞

Randy Schnier、Jim Knutson、Jonathan Marshall、および Robert Peterson の本稿へのご協力に感謝いたします。


ダウンロード

内容ファイル名サイズ
Sample applicationOpenJPASample.zip23KB

参考文献

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=WebSphere
ArticleID=328408
ArticleTitle=WebSphere Application Server V6.1でのOpenJPAの活用
publish-date=10262006