EJB 3.0仕様では、EJBプログラミング・モデルが大幅に改良されました(これを「必要な改良」と言う人もいます)。アノテーション付きPOJO(plain old Java object)の使用に重点を置いており、EJBプログラミング・モデル全体がこれまでの EJB仕様とは大きく異なっています。この新たなプログラミング・モデルで多くの注目を集める点の1つに、パーシスタンス・アーキテクチャーがあります。この記事では、WebSphere Application Server V6.1を使用してこれらの一部の機能を活用する完全な例を用いて、この新しいJava Persistence APIを紹介します。
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サイトにあります(「参考文献」を参照)。
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をセットアップする方法を説明します。
- Application Server Toolkitを開始します。
- 空のワークスペースを開きます。
図10. ワークスペースの起動
- 「Welcome」画面を閉じます。
図11. AST Welcome
- J2EEパースペクティブに切り替えます。
図12. J2EEパースペクティブの選択
- 空のワークスペースを開きます。
- まず最初に、WebSphere Application Server V6.1を単体テスト環境としてセットアップする必要があります。ここで、ローカル・シングル・サーバーとして WebSphere Application Server V6.1が既にインストールされていることを前提とします。また、プロファイルが既に作成されていることも前提とします。(インストールとプロファイルの詳細については、「参考文献」を参照してください。)
- 「Servers」ビューに移動し、ビュー内を右クリックします。
- New => Serverを選択します(図13)。
図13. 新規サーバーの作成
- 「IBM」=>「WebSphere v6.1 Server」を選択して「Create New runtime」を選択し、「Next」をクリックします(図14)。
図14. 新規ランタイムの作成
- 「Name」のデフォルト値をそのまま使用し、WebSphere Application Server V6.1のインストール・ディレクトリーを指定し、「Next」をクリックします。
図15. 新規ランタイムの定義
- 適切なポート番号のアプリケーション・サーバー・プロファイルを選択します。この例では、保護プロファイルを使用します。この場合、管理ユーザーIDとパスワードを入力する必要があります。「Finish」をクリックします。
図16. 新規サーバーの定義
- ASTが、デフォルトでJava 1.4 JDKとJREを使用するようセットアップされていることがあります。JPAではJava 5のアノテーションと機能が使用されるので、Java 5コードをコンパイルできるようにするため、プリファレンスを更新する必要があります。
- メインメニューで「Window」を選択し、「Pereferences」を選択します。
図17. 設定の変更
- 「Java」セクションを展開し、「Compiler」を選択します。
- 「Compiler compliance level」を5.0に変更して、「Apply」をクリックします。
図18. コンパイラーの準拠レベルの変更
- 「Installed JREs」に切り替え、「WebSphere Application Server v6.1 JRE」を選択します。
図19. JREの切り替え
- 「OK」をクリックして変更を保存し、次に「Yes」をクリックしてビルドを実行します。
図20. コンパイラー設定の変更とビルド
- メインメニューで「Window」を選択し、「Pereferences」を選択します。
Java EE プロジェクトの作成
このセクションでは、各種Java EEプロジェクトの作成方法と、JPAを格納するEARファイルのセットアップ方法を説明します。
- Enterprise Application Projectと対応するサブプロジェクト(EJBプロジェクトとWebプロジェクト)を作成するには、Project Explorerで「Enterprise Applications」を右クリックし、「New」=>「Enterprise Application Project」を選択します。
図21. Enterprise Application Projectの作成
- 「Project Name」にOpenJPATestEARと入力し、「Target runtime」でWebSphere Application Server v6.1を選択します(図22)。「Next」をクリックします。
図22. Enterprise Application Projectの定義
- 「Select Project Facets」ページのデフォルト設定を受け入れ、「Next」をクリックします(図23)。
図23. プロジェクト・ファセットの選択
- 「New Module...」をクリックし、新規J2EEモジュール・ウィザードを開始します(図24)。
図24. 新規J2EEモジュール・ウィザードの開始
- EJBプロジェクトとWebプロジェクトを以下の名前で作成します(図25)。
- EJB モジュール: OpenJPATest
- Web モジュール: OpenJPATestWeb
図25. デフォルトJ2EEモジュールの作成
- 作成したモジュールがプロジェクト・ウィンドウに表示されます。「Finish」をクリックします。EARプロジェクトの作成が完了します(図26)。
図26. EARプロジェクト作成完了
必要な成果物がすべて作成され、必須従属ファイルがインポートされるまでは、コンパイル・エラーが発生する可能性がある点に注意してください。
DB2データベースおよびWebSphere Application Serverデータベース構成のセットアップ
アプリケーションを実行するにはデータベースをセットアップする必要があります。この記事の例ではDB2®バージョン9を使用しており、表DDLスクリプトとテスト・データが既に用意されています。使用するデータベースによっては、スキーマを変更する必要があります。(あるいは、OpenJPA資料を参照してご使用のデータベースに対応したDDLを生成することもできます。詳しくは「参考文献」を参照してください。)
- 提供されるダウンロード・ファイルのOrderEntryDBフォルダーで必要なスクリプトを見つけます。
- DB2コマンド・ウィンドウでこれらのスクリプトを実行します。DB2コマンド・ウィンドウを表示するには、「IBM DB2」=>「Command Line Tools」=>「Command Window」の順に選択します。
- DB2データベースを作成するため、次のようなDB2コマンドを入力します。
db2 create db JPATEST
- データベースが作成されたら、データベースに接続するため、同じコマンド・ウィンドウから次のようなコマンドを入力します。
db2 connect to JPATEST user db2admin using db2admin
- ダウンロード・ファイルに含まれているDDLスクリプトを実行するため、次のコマンドを実行します。
db2 -tvf C:\<directory>\createTables.DDL
- 同様の方法でデータ作成スクリプトも実行できます。
db2 -tvf C:\<directory>\createData.sql
- DB2データベースを作成するため、次のようなDB2コマンドを入力します。
- この記事の例では、例を単純にするため、WebSphere Application Serverの拡張EAR機能を使用しています。この機能では、アプリケーションにデータベース構成を保存できます。アプリケーションのインストールが完了すると、WebSphere Application Serverはこの情報を使用して適切な構成を作成します。これにより、アプリケーション・サーバーに必要なJDBCドライバーとDataSourceの構成にかかる時間が短縮されます。
(拡張EAR機能は迅速なプロトタイピングのために使用される機能ですが、さまざまなテスト環境や実稼働環境でアプリケーションを適切に管理できるようにするため、wsadminスクリプト(または管理コンソール)を使用してサーバー上で必須リソースを構成しておくことをお勧めします。)- データベース構成をアプリケーションに追加するため、EARプロジェクトでapplication.xmlファイルを開きます。このファイルを開くには、図27に示すOpenJPATestEARデプロイメント記述子アイコンをダブルクリックします。
図27. EARプロジェクトを開く
- 「Deployment」タブを選択します。図28では、該当する構成アイテムが強調表示されています。
図28. デプロイメント記述子の構成
- この図からわかるように、構成パネルにはさまざまなセクションがあります。値を入力するには、「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: <<パスワード>>
- DB2UNIVERSAL_JDBC_DRIVER_PATH: <<DB2 Root>>/java
- 例: C:\Progra~1\IBM\SQLLIB\java
- 画面1:
- データベース構成をアプリケーションに追加するため、EARプロジェクトでapplication.xmlファイルを開きます。このファイルを開くには、図27に示すOpenJPATestEARデプロイメント記述子アイコンをダブルクリックします。
エンタープライズ・アプリケーションへのJPA JARファイルの追加
OpenJPA JARと依存ファイルをEARファイルに追加するため、Enterprise Application ProjectのEarContentファイルにこれらをインポートする必要があります。
- 最初に依存JARファイルを追加します。
- OpenJPATestEARプロジェクトの中のEarContentフォルダーを右クリックし、次に示すように「Import...」を選択します。
図29. JARファイルのインポート
- 「File system」を選択し、「Next」をクリックします(図30)。
図30. ファイル・システムの選択
- 「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ファイルの選択
- OpenJPATestEARプロジェクトの中のEarContentフォルダーを右クリックし、次に示すように「Import...」を選択します。
- 次に、JPA実装JARファイルをインポートする必要があります。前のステップと同様に、JPAインストール・ディレクトリーのルートに移動し、インポートするJARファイルとしてopen-all-0.9.6-incubating.jarを選択し、「Finish」をクリックします。
図32. JPA実装JARファイルのインポート
- EJBプロジェクトがJARファイルを検出できるようにするため、EJBプロジェクトのクラスパスを更新します。
- EJB ProjectsフォルダーのOpenJPATestプロジェクトを右クリックし、「Properties」を選択します(図33)。
図33. プロジェクト・プロパティーの表示
- 出力ディレクトリーをソース・ディレクトリーと同一に変更します。これにより、JPAエンハンスメントステップが正しく機能します。このように出力ディレクトリーを変更するには、「Java Build Path」項目を選択し、デフォルト出力フォルダーを「OpenJPATest/ejbModule」に変更します(図34)。
図34. 出力ディレクトリーとソース・ディレクトリーを同一にする
- 「J2EE Module Dependencies」に切り替え、図35に示すようにすべてのJARを選択します。
図35. すべての従属JARファイルの選択
- EJB ProjectsフォルダーのOpenJPATestプロジェクトを右クリックし、「Properties」を選択します(図33)。
- これで、プロジェクトのJavaソースをインポートできます。
- OpenJPATestプロジェクトの中のejbModuleフォルダーを右クリックし、「Import」を選択します。
- 「File system」を選択し、「Next」をクリックします。
- ダウンロードしたファイルをディレクトリーに解凍し、ダウンロード・ディレクトリーの中のejbModuleフォルダーを入力します(図36)。
図36. ダウンロードしたリソースのインポート
- 上書きするかどうかの確認を求められたら、「Yes To All」を選択します。
Eclipseビルドにエンハンスメントを追加する
OpenJPAは、バイトコードエンハンスメントを使用して、パーシスタンス動作をJPAオブジェクトに追加します。クラスをエンハンスする方法は複数あります(「参考文献」を参照)。この記事の例では、エンハンサーを実行する単純なANTスクリプトを利用します。開発プロセスを単純にするため、AntビルドをEclipseビルドに組み込みます。これにより、Eclipseでクラスをコンパイルすると、JPAエンハンサーがビルドの一部として実行されます。これにより、開発プロセスが簡素化されます。
- 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> - Eclipseビルドの一部としてエンハンサーを実行するには、ビルダーを構成する必要があります。
- OpenJPATest EJBプロジェクトを右クリックして「Properties」を選択します。
図38. プロジェクト・プロパティーの表示
- 「Builders」セクションで「New」をクリックし、「Ant Build」を選択します(図39)。
図39. Antビルドの構成
- ビルダーにJPAEnhanceという名前を指定します。
- 「Main」タブでワークスペースを参照し、ejbModuleディレクトリーの中にあるbuild.xmlファイルを選択します。
- 「Arguments」タブで「-verbose -debug」フラグを追加します。最終的な構成は図40のようになります。
図40. ビルダーの構成
- エンハンスメントが完了したらワークスペース全体をリフレッシュするため、「Refresh」タブで「Refresh resources upon completion」を選択します(図41)。
図41. Refresh workspace upon completion
- 「Targets」タブに切り替え、「Manual Build」と「Auto Build」でエンハンスメントタスクを選択します(図42)。
図42. 拡張タスクの選択
- すべてのJPA JARを追加するため、「Classpath」タブ(図43)で「Add JARs」をクリックし、ワークスペースを参照してEARファイルを選択し、すべてのEARコンテンツを追加します。
- また、ejbModuleディレクトリーをビルドのクラスパスに追加する必要があります。この追加操作は、「Add Folders...」を選択して実行します。
- 最後に、WebSphere Application Serverインストール・ディレクトリーの中のlibディレクトリーにあるj2ee.jarファイルを追加します。この追加操作は、「Add External JARs...」を選択して実行します。
図43. 構成へのJARファイルの追加
- 「OK」をクリックします。ビルダーが保存されます。
- ビルドではJPAEnhanceタスクが最後に実行される必要があります(図44)。自動ビルドに設定している場合は、エンハンサーが実行されるはずです(図45)。エンハンスメントが正常に実行された場合の出力の例を図46に示します。
図44. ビルド・タスク
図45. 自動ビルドの有効化
図46. 正常に実行されたエンハンスメントの出力
- OpenJPATest EJBプロジェクトを右クリックして「Properties」を選択します。
サンプル・アプリケーションについて
これでデータベース、サーバー、およびワークスペースの構成が完了しました。次に、アプリケーションについて説明します。アーキテクチャーについては既に概説しているためパッケージングにのみ触れ、OpenJPAの構成について説明します。
- Project Explorer でejbModuleフォルダーを展開し、すべてのパッケージを表示します。図47に、各パッケージの位置を示します。
- JPAエンティティー・パッケージには、アノテーション付きJPAエンティティー・オブジェクトが含まれています。
図47. すべてのejbModuleパッケージ
- エンティティーを確認します。Customer Entityオブジェクトをリスト2に示します。このオブジェクトをパーシスタンス対応にするには、以下のクラスに示すように、アノテーションを追加します。
リスト2package 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; } } - また、OrderProcessorBeanが含まれているPOJOファサード・パッケージもあります。このPOJOパッケージは、エンティティーへのアクセスおよびエンティティーの更新にJPAを使用します。
OrderProcessorBeanの一部をリスト3に示します。コンストラクターで、2つのEntityManagerFactoryを取得している点に注意してください。この理由については次のセクションで説明します。
リスト3public 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を閉じる必要があります。これについては、次のセクションで説明します。)
- JPAエンティティー・パッケージには、アノテーション付きJPAエンティティー・オブジェクトが含まれています。
- persistence.xmlは、JPAエンティティーとデータベースの必要な構成が含まれているパーシスタンス・ユニットを定義する記述子です。
- persistence.xmlを開いて内容を確認します。
図48. persistence.xmlを開く
- 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>
- persistence.xmlを開いて内容を確認します。
次の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クライアントのインポート
アプリケーションをテストする目的で、所要の順序でユースケースを実行する単純なテスト・サーブレットが用意されています。
- まずWebプロジェクトをインポートします。
- OpenJPATestWebプロジェクトを右クリックして「Import」を選択します(図49)。
図49. Webプロジェクトのインポート
- 「File System」を選択し、「Next」をクリックします。
- 「From directory」フィールドで<<ダウンロード・ファイル>>/WebClientを見つけます(図 50)。「Into folder:」フィールドにWeb プロジェクトのルートが設定されていることを確認します。「Finish」をクリックします。
図50. ダウンロードしたWebクライアントの参照
- 「Yes」をクリックして、デフォルト設定を上書きします。
図51. デフォルト設定の上書き
- OpenJPATestWebプロジェクトを右クリックして「Import」を選択します(図49)。
- 次に、Webプロジェクトのクラスパスを、EJB JARファイルを指し示すように更新する必要があります。
- Webプロジェクトを右クリックして「Properties」を選択します(図52)。
図52. プロジェクト・プロパティーの更新
- J2EE Module Dependenciesの中のOpenJPATestEJB.jarファイルを選択し、「OK」をクリックします(図53)。
図53. JARファイルの選択
- Webプロジェクトを右クリックして「Properties」を選択します(図52)。
Application Server Toolkitを使用したWebSphere Application Server V6.1でのアプリケーションの実行
アプリケーションを実行するには、EARファイルをインストールしてテスト・サーブレットを呼び出します。この操作は、サポートされているWebSphere Application Serverデプロイメント・モデルで実行できます。この記事の例では、Application Server Toolkitから直接テストを実行します。
- Application Server Toolkitからアプリケーションをインストールするために必要な操作は、サーバーへのアプリケーションの追加だけです。
- 「Server」ビューで「WebSphere v6.1 Server」を右クリックし、「Add and Remove Projects...」を選択します(図54)。
図54. サーバーへのプロジェクトの追加
- 「Available projects」からアプリケーションを選択し、「Add」を選択します。これで、選択したアプリケーションが「Configured projects」に移動します(図55)。「Finish」をクリックします。
図55. 使用可能なプロジェクトから構成済みプロジェクトへの移動
- コンソールで、開始サーバーとアプリケーションの両方をモニターします(図56)。(サーバーが開始しない場合は、右クリックして「Start」を選択します。)
図56. アプリケーションとサーバーに関するコンソール・メッセージ
- 「Server」ビューで「WebSphere v6.1 Server」を右クリックし、「Add and Remove Projects...」を選択します(図54)。
- アプリケーションが開始したら、サーブレットをテストできます。
- 「OpenJPATestWeb」=>「Servlets」=>「JPATester」の順に展開します。「JPATester」を右クリックし、「Run As」=>「Run on Server」の順に選択します(図57)。
図57. サーブレットのテスト
- 「Set server as project default」にチェック・マークを付けます(図58)。(これは、プロジェクトを初めて実行するときにだけ行う操作です。)
図58. プロジェクトのデフォルトとして設定する
- ブラウザーが開き、図59に示すような結果が表示されます。サーブレットが適切に実行されている場合は、注文がない顧客が表示され、注文を新規に作成し、明細を追加し、注文を送信します。
図59. テスト結果
- 「OpenJPATestWeb」=>「Servlets」=>「JPATester」の順に展開します。「JPATester」を右クリックし、「Run As」=>「Run on Server」の順に選択します(図57)。
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 application | OpenJPASample.zip | 23KB | HTTP |
- developerWorks Japan: WebSphere: WebSphereの日本の技術情報サイトです
- developerWorks: WebSphere(US) : WebSphereの英語の技術情報サイトです
- アプリケーション・サーバー
- JSR 220:Enterprise JavaBeans 3.0 仕様
- Apache OpenJPA
- Enterprise JavaBeans 3.0
- Examining the EJB 3.0 Simplified API (US)
- IBM WebSphere: Deployment and Advanced Configuration
- Developing custom mediations for WebSphere Enterprise Service Bus (US)
- IBM WebSphere System Administration
- WebSphere Application Server: Step-by-step
- WebSphere Application Server インフォメーション・センター (US)
Roland Barcia は、ニューヨーク/ニュージャージー首都圏の IBM Software Services for WebSphere で認定 IT スペシャリストとして活躍しています。「IBM WebSphere: Deployment and Advanced Configuration」の共著者です。Roland についての詳しい情報は、彼の Web サイトにアクセスしてください。