アプリケーション・サーバーのコンテナーには、Java™ Enterprise Edition (Java EE) 環境における Java Persistence API
(JPA) に必要な機能の多くを提供できます。
アプリケーション・サーバーでは、Java EE 環境でのアプリケーション開発を支援する
JPA コマンド・ツールも提供しています。
このタスクについて
重要: これらの JPA コマンド・ツールを使用する場合は、これらのツールを
app_server_root/bin ディレクトリーからではなく、<
profile_root>/bin ディレクトリーから実行します。リリース・レベルに適した最新バージョンのコマンドを使用してください。
このタスクでは、JPA 2.1 インターフェースに対してコンパイルするため、クラスパスに com.ibm.ws.jpa-2.1.thinclient_9.0.jar というスタンドアロン Java アーカイブ (JAR) ファイルを指定する必要があります。
JPA 2.0 インターフェースに対してコンパイルするには、com.ibm.ws.jpa-2.0.thinclient_9.0.jar を指定します。
このスタンドアロン JAR ファイルは、インストール・イメージから入手できます。サーバー・インストール・イメージにおけるこれらのファイルの位置は、${app_server_root}/runtimes のディレクトリーの中です。
重要: JPA アプリケーションでは、コンテナー管理パーシスタンス (CMP) または Bean 管理パーシスタンス (BMP) を使用するアプリケーションとは異なる構成手法が必要です。
また、CMP または BMP を実装するアプリケーションに関連した通常のデプロイメント手法に従いません。
JPA アプリケーションでは、パーシスタンス・ユニットを定義して正しいプロパティーを構成し、そのアプリケーションが Java EE 環境で確実に実行できるようにする必要があります。
コンテナーにより、すべての必要な注入がサポートされ、
Java EE 環境でアプリケーションが実行できるようになります。
例えば、コンテナーでは、アプリケーションに対して @PersistenceUnit および @PersistenceContext を注入できます。
手順
- エンティティー・クラスを生成します。 これらは、Plain Old Java Object (POJO) エンティティーです。
ユーザーの開発モデルに応じて、以下の JPA ツールの一部またはすべてを使用します。
- トップダウン・マッピング: 最初、エンティティーの定義およびオブジェクト・リレーショナル・マッピングから開始し、次にそのデータからデータベース・スキーマを派生させます。
この方法を使用する場合は、オブジェクト・モデルのアーキテクチャーについてまず検討し、
次にエンティティー・クラスの作成という順番になることが多いでしょう。
これらのエンティティー・クラスから、最終的にデータベース・モデルを作成します。
オブジェクト・モデルから関係モデルへの top-down マッピングを使用する場合は、エンティティー・クラスを開発し、次に JPA プロバイダーの機能を使用して、そのエンティティー・クラスに基づくデータベース表を生成します。
パーシスタンス・プロバイダーとして OpenJPA を使用する場合、このアプローチでは、wsmapping ツールが役立ちます。
- ボトムアップ・マッピング: データベース・スキーマであるデータ・モデルから開始し、次にエンティティー・クラスへと作業を進めます。
パーシスタンス・プロバイダーとして OpenJPA を使用する場合、このアプローチでは、wsreversemapping ツールが役立ちます。
- 中間マッピングで適合: これが一般的な開発モデルと思われます。
部分的に完成したデータ・モデルとオブジェクト・モデルを組み合わせます。
目的および要件に応じて、そのリレーションシップを調整して差異を解決する必要があります。
パーシスタンス・プロバイダーとして OpenJPA を使用する場合、このアプローチでは、wsmapping ツールと wsreversemapping ツールの両方が役立ちます。
アプリケーション・サーバーの JPA ソリューションでは、JPA アプリケーションの開発に役立つ複数のツールが提供されています。
これらのツールを IBM® Rational® Application Developer と組み合わせることにより、
Java EE または Java SE アプリケーションのいずれかに対して、
安定した開発環境が提供されます。
Rational Application Developer には、アノテーションを挿入する GUI ツール、カスタマイズされた persistence.xml ファイル・エディター、データベース・エクスプローラー、およびその他のフィーチャーが含まれています。もう 1 つの選択肢として、Eclipse Dali プロジェクトがあります。
Rational Application Developer または Eclipse Dali プラグインについて詳しくは、それぞれの Web サイトを参照してください。
- エンティティー・クラスをコンパイルします。
エンティティーのコンパイルは、Criteria API を使用する場合を除き、Java クラスの場合と同じようにして実行します。
Criteria API を使用する場合は、Criteria API メタモデル・クラスも生成する必要があります。
以下に、このオプションの使用方法の例を示します。
EclipseLink を使用する場合、
javac コマンドに以下の引数を指定します。
-processor
org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor
-Aeclipselink.persistencexml= persistence.xml_location
app_server_root/java/bin/javac
-classpath app_server_root/runtimes/com.ibm.ws.jpa-2.1.thinclient_9.0.0.jar
-processor
org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor
-Aeclipselink.persistencexml=app_location/src/META-INF/persistence.xml mypackage\MyEntity.java
OpenJPA または WSJPA を使用する場合、
javac コマンドに以下の引数を指定します。
-Aopenjpa.metamodel=true
app_server_root/java/bin/javac
-Aopenjpa.metamodel=true
-classpath app_server_root/runtimes/com.ibm.ws.jpa-2.0.thinclient_9.0.0.jar
mypackage/MyEntity.java
- JPA 拡張ツール (EclipseLink の場合は eclenhancer、OpenJPA の場合は wsenhancer) を使用して、エンティティー・クラスを拡張します。 拡張ツールは、パーシスタント・クラス作成後、それらにプロバイダー固有の統合バイトコードを追加するツールです。
拡張ツールでは、Java コンパイラーによって生成されたバイトコードを後処理し、パーシスタンス・フィーチャーの実装に必要なフィールドおよびメソッドを追加します。
アプリケーション・サーバーのパーシスタンス・プロバイダーで実行時に自動的にエンティティーを拡張することはできますが、アプリケーションのビルド時にエンティティーを拡張できれば、パフォーマンスがさらに向上します。
アプリケーションは、既に拡張されているエンティティーの拡張は試行しません。
eclenhancer ツールの使用方法の例については、eclenhancer コマンドのトピックを参照してください。
wsenhancer ツールの使用方法の例については、wsenhancer コマンドのトピックを参照してください。
- オプション: bottom-up マッピングの開発モデルを使用していない場合は、自動的に、あるいは eclenhancer または wsmapping ツールを使用して、データベース表を生成するか更新してください。
- デフォルトでは、オブジェクト関連マッピングは自動的には実行されませんが、そのマッピングを提供するようにアプリケーション・サーバーを構成できます。これは、EclipseLink の場合は eclipselink.ddl-generation プロパティーを使用して、OpenJPA の場合は openjpa.jdbc.SynchronizeMappings プロパティーを使用して行います。
これらのプロパティーにより、データベース表がオブジェクト・モデルに自動的に突き合わせられるようになり、開発を促進できます。自動マッピングを使用可能にするには、persistence.xml ファイルに次の行を組み込みます。
EclipseLink の場合:
<property name="eclipselink.ddl-generation" value =“create-tables”/>
OpenJPA の場合:
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
JPA 2.1 標準:
<property name="javax.persistence.schema-generation.database.action" value="create"/>
トラブルの回避 (Avoid trouble): 実行時に自動オブジェクト・リレーショナル・マッピングを使用可能にするには、Java の .class ファイル、マッピング・ファイル、および Java
アーカイブ (JAR) ファイルの各エレメントに XML
フォーマットですべてのパーシスタント・クラスがリストされている必要があります。
gotcha
- データベース表を手動で更新または生成するには、コマンド行からアプリケーション・サーバーの JPA マッピング・ツールを実行し、データベースに表を作成します。
eclenhancer ツールの実行方法の例については、eclenhancer コマンドのトピックを参照してください。
wsmapping ツールの使用方法の例については、wsmapping コマンドのトピックを参照してください。
- オプション: OpenJPA および DB2® を使用しており、静的 Structured Query Language (SQL) を使用する場合は、wsdbgen コマンドを実行します。 wsdbgen コマンドを使用するには、IBM Optim pureQuery ランタイムがインストールされている必要があります。wsdbgen コマンドでは、persistence.xml ファイルのある META-INF ディレクトリー内に
persistence_unit_name.pdqxml ファイルが作成されます。
複数のパーシスタンス・ユニットがある場合は、パーシスタンス・ユニットごとに wsdbgen コマンドを実行する必要があります。
あるアプリケーションによって複数の pdqxml ファイルが参照される場合は、マージ・ユーティリティーを使用してこれらのファイルを単一の pdqxml ファイルに結合します。
結合された pdqxml ファイルを pdqProperties という名前の pureQueryXml プロパティーとして指定します。IBM Integrated Data Management インフォメーション・センターで Merge ユーティリティーの資料を参照してください。
トラブルの回避 (Avoid trouble): JPA を実装し、静的な SQL を実行するように構成されているアプリケーションでは、さまざまな例外が発生する可能性があります。これらの例外は、
wsdbgen コマンドの実行時に発生することがあります。このコマンドは、アプリケーションを準備するとき、またはアプリケーションの実行中に JPA メソッドを呼び出すときに使用できます。この問題を解決するには、以下のステップを実行します。
- iSeries JDBC Driver V5R4 のプログラム一時修正 (PTF) をインストールします。インストールするのは、PTF 番号 SI32561 および SI32562 です。これらの PTF は、IBM System i® Support: PTF Cover Letters Web サイトで入手できます。
- DB2 Universal Database™ for iSeries V6R1 または V5R3 を使用している場合は、該当するリリースの修正 Web サイトを参照してください。
- 必要なレベルの pureQuery (バージョン 1.3.100 以降) をインストールします。詳しくは、IBM Optim
pureQuery Runtime Web サイトを参照してください。最新の JCC ドライバー (バージョン 3.52.95 以降) をインストールし、APAR PK65069 の修正を適用します。最新の JCC ドライバーは、IBM DB2 ソフトウェア・パッケージに含まれています。
- DB2 on z/OS® サーバーの場合は、V8 代替ドライバーに対応する PTF UK39204 または V9 に対応する PTF UK39205 をインストールし、APAR PK67706 の修正をインストールします。
gotcha
このコマンドの実行方法の例については、『wsdbgen コマンド』トピックを参照してください。
- オプション: OpenJPA および アプリケーション管理 ID を使用している場合は、wsappid ツールを使用してアプリケーション管理 ID クラスを生成します。 アプリケーション管理 ID を使用する場合は、1 つ以上のフィールドを ID フィールドにする必要があります。
エンティティーに複数の ID フィールドがあり、少なくともそのフィールドのいずれかが別のエンティティーに関連している場合は、ID クラスを使用します。
アプリケーション管理 ID ツールでは、アプリケーション管理
ID を実装するすべてのパーシスタント・タイプに対して ID
クラスを使用する Java コードを生成します。
wsappid ツールの使用方法の例については、『wsappid コマンド』トピックを参照してください。
例
以下は、
persistence.xml ファイルの例です。
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd” ">
<persistence-unit name="TheWildZooPU" transaction-type="JTA">
<jta-data-source>jdbc/DataSourceJNDI</jta-data-source>
<!-- additional Mapping file, in addition to orm.xml>
<mapping-file>META-INF/JPAorm.xml</mapping-file>
<class>com.company.bean.jpa.PersistebleObjectImpl</class>
<class>com.company.bean.jpa.Animal</class>
<class>com.company.bean.jpa.Dog</class>
<class>com.company.bean.jpa.Cat</class>
<properties>
<property name=”eclipselink.ddl-generation”
value=”create-tables”/>
</properties>
</persistence-unit>
</persistence>