Java EE 5 プラットフォームでの Java Persistence
このドキュメントでは、Java™ Persistence を使用して Web アプリケーションを開発する基本的な手順を示します。Java Persistence API は、Java EE 5 プラットフォームの一部として導入されました。このチュートリアルでは、簡単な Web アプリケーションプロジェクトを作成します。プロジェクトでは持続性を使用しますが、Java Persistence API により、EJB モジュールを作成しなくても持続性を使用できます。
プロジェクトで Java Persistence を使用すると、持続フィールドまたはプロパティー向けのオブジェクトリレーショナルマッピング情報を提供する配備記述子の設定が不要になり、アプリケーション開発が大幅に簡素化されます。代わりに、注釈を使用して、これらのプロパティーを簡単な Java クラス内で直接定義できます。
エンティティーの持続性は、EntityManager API によって管理されます。EntityManager API は持続性コンテキストを処理し、各持続性コンテキストはエンティティーインスタンスのグループです。アプリケーション開発時には、クラス内で注釈を使用して、エンティティーのインスタンスからなる持続性コンテキストのインスタンスを指定できます。そうすると、エンティティーのインスタンスのライフサイクルは、コンテナによって処理されます。
このドキュメントでは NetBeans IDE 6.1 リリースを使用します。
予想される所要時間: 15 分
チュートリアルの課題
このチュートリアルに従うには、次のソフトウェアとリソースが必要です。
| NetBeans IDE |
Web および Java EE の version 6.1 |
| Java Development Kit (JDK) |
version 6 または
version 5 |
| GlassFish アプリケーションサーバー |
V2 |
このチュートリアルでは、GlassFish または Sun Java System Application Server のローカルインスタンスを IDE に登録する必要があります。IDE には GlassFish アプリケーションサーバーが含まれます。IDE をインストールするときにこのアプリケーションサーバーをオプションとしてインストールした場合、サーバーはすでに IDE に登録されています。
前提条件
このドキュメントは、次のテクノロジについて基本的な知識またはプログラミング経験を持つ読者を想定して書かれています。
- Java プログラミング
- NetBeans IDE
Web アプリケーションプロジェクトの設定
この課題の目標は、ZooApp という Web アプリケーションプロジェクトを作成することです。このアプリケーションでは、Java Persisitence モデルの機能を利用します。その機能の 1 つは、エンティティーオブジェクトを簡単な Java クラスにできることです。そのため、エンティティーオブジェクトを EJB モジュール内に置いて EAR ファイルにパッケージ化する必要はありません。このことは、エンティティークラスを直接 Web アプリケーションの内部に作成できることを意味します。
このチュートリアルでは、JavaServer Faces (JSF) ページ内のフォームを使用して、データベース内のデータの読み取りや変更を行います。
- 「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択します。「Web」カテゴリから「Web アプリケーション」を選択し、「次へ」をクリックします。
- プロジェクト名として「ZooApp」と入力し、プロジェクトの場所を設定します。
- 専用フォルダを使用するオプションが選択されている場合は選択を解除します。
このチュートリアルでは、ライブラリをほかのユーザーと共有する必要がないので、プロジェクトライブラリを専用のフォルダにコピーする理由はほとんどありません。
「次へ」をクリックします。
- サーバーを GlassFish に設定し、Java EE バージョンを Java EE 5 に設定します。「次へ」をクリックします。
- 「JavaServer Faces」チェックボックスを選択し、「完了」をクリックします。
まとめ
この課題では、エンティティークラスを含める Java EE 5 Web アプリケーションを作成しました。
持続性ユニットの作成
この課題では、エンティティーマネージャーによって管理されるエンティティークラスやこれらのエンティティーによって使用されるデータソースをコンテナに指示するための、持続性ユニットを作成します。
持続性ユニットの作成は、Web モジュール内に作成する persistence.xml でプロパティーを定義することによって行います。持続性ユニットの名前を指定したあと、コンテナがエンティティーのインスタンスを管理するために使用する持続性プロバイダを指定することになります。また、データソースと、表の生成方法を指定する必要があります。持続性ユニットの作成には「新規持続性ユニット」ウィザードを使用します。
「新規エンティティークラス」ウィザードで持続性ユニットを作成することもできます。エンティティークラス作成時に持続性ユニットが存在しない場合は、ウィザードからその作成を求められます。
持続性ユニットの作成
- 「プロジェクト」ウィンドウで「ZooApp」Web アプリケーションノードを右クリックし、「新規」>「その他」を選択して「新規ファイル」ウィザードを開きます。
- 「持続性」カテゴリから「持続性ユニット」を選択し、「次へ」をクリックします。
- 持続性ユニットの名前はデフォルトのままにしておきます。
- 「持続性プロバイダ」には「TopLink」(デフォルト) を使用します。
デフォルトのプロバイダは TopLink Essential.jar です。TopLink Essential.jar には Java Persistence 用のライブラリが含まれています。エンティティーマネージャーは TopLink Essential.jar に置かれています。
- 「データソース」には、デフォルトのデータソース「jdbc/sample」を使用します。
データソース jdbc/sample は、GlassFish アプリケーションサーバーにバンドルされている Java DB データベースに接続するようにすでに設定されています。データベースのデータソースを作成すれば、別のデータベースを使用できます。
- 持続性ユニットが Java Transaction API を使用していること、アプリケーション配備時にエンティティークラスに基づいた表が作成されるように「Table Generation Strategy」が「作成」に設定されていることを確認します。
- 「完了」をクリックします。
「完了」をクリックすると、IDE によって persistence.xml が作成され、ソースエディタの「デザイン」ビューに表示されます。ソースエディタのツールバーにある「XML」をクリックすると、persistence.xml の XML を表示できます。このファイルには、アプリケーションのエンティティーおよび持続性を管理するために Java EE 5 コンテナが必要とする情報がすべて含まれています。
まとめ
この課題では、データソース、持続させるエンティティークラス、およびエンティティーのライフサイクル管理のためにコンテナが使用するエンティティーマネージャーを指定するための、持続性ユニットを作成しました。
エンティティークラスの作成
この課題では、作成するリレーショナルデータベース内の表を表す 2 つのエンティティークラス、Animal.java と Pavilion.java を作成します。次に、データを表現するために、これらのクラス内にいくつかのフィールドを定義します。Java Persistence 仕様では、注釈を使用して、オブジェクトリレーショナルマッピングの情報など、フィールドについての情報をコンテナに提供できます。
エンティティークラス Animal と Pavilion の作成
まず、Animal と Pavilion というエンティティークラスを作成します。これらのクラスは、データベース内の ANIMAL と PAVILION という表を表します。
エンティティークラスを作成すると、クラスをエンティティークラスとして定義するための @Entity という注釈が IDE によって追加されます。クラスを作成したあとで、表で表示するデータを表すフィールドをクラス内に作成し、注釈を使用してこれらのフィールドの一部についての追加情報を与えることになります。
各エンティティークラスは主キーを持つ必要があります。エンティティークラスを作成すると、IDE によって、どのフィールドを主キーとして使用するかを宣言するための @Id という注釈が追加されます。また、主 ID のキー生成方法を指定するための @Generated という注釈も IDE によって追加されます。
エンティティークラスを作成するには、次の手順を実行します。
- 「ZooApp」プロジェクトノードを右クリックし、「新規」>「その他」を選択します。
- 「持続性」カテゴリから「エンティティークラス」を選択し、「次へ」をクリックします。
- クラス名に「Animal」を、パッケージに「entity」をそれぞれ入力し、「主キーの型」は Long のままにしておきます。「完了」をクリックします。
- 同じ手順で entity ソースパッケージに Pavilion クラスを作成します。
「完了」をクリックすると、新しいエンティティークラスがエディタに表示されます。「プロジェクト」ウィンドウで「ソースパッケージ」の下にある「entity」ノードを展開すると、エンティティークラス Animal と Pavilion が表示されます。
Animal クラスのフィールドの定義
Animal クラスをエディタで開き、次の手順に従います。
- このクラスに次のフィールド宣言 (ボールド部分) を追加します。
public class Animal implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String name;
private String kind;
private String weight;
private Pavilion pavilion;
- ソースエディタ内を右クリックして「コードを挿入」(Alt-Insert) を選択し、「取得メソッドおよび設定メソッド」を選択して「取得メソッドおよび設定メソッドの生成」ダイアログを開きます。
- 「取得メソッドおよび設定メソッドの生成」ダイアログですべてのフィールドを選択し、「生成」をクリックします。
「取得メソッドおよび設定メソッドの生成」ダイアログでは、キーボードの上矢印キーを使用して、選択した項目を Animal 項目まで移動してから、スペースバーを押して Animal 内のすべてのフィールドを選択できます。
- 続いて、Animal 表内に作成される列の 1 つの名前を変更し、この列の名前を name ではなく animalName とします。name フィールドの宣言の上に次の注釈を追加すると、生成される列の名前を指定できます。
@Column(name="animalName")
private String name;
- name フィールドに @Column 注釈を付けたとき、クラス識別子の横の左マージンに警告が表示されました。マージン内にある警告アイコンをクリックし、「フィールドアクセスの単一化」を選択します。
「フィールドアクセスの単一化」をクリックすると、@Id と @GeneratedValue の各注釈が getId 取得メソッドから
private Long id のすぐ上まで移動されます。
- Animal 表の pavilion 列には多対 1 の関係が必要です。pavilion の宣言の上に次の注釈を追加すると、この操作を行うことができます。
@ManyToOne
private Pavilion pavilion;
- Alt-Shift-I キーを押して、このクラスに必要なインポート文を生成します。
- 変更を保存します。
次の手順では、Pavilion エンティティークラス内のフィールドを定義します。
Pavilion クラスのフィールドの定義
Pavilion クラスをエディタで開き、次の手順に従います。
- このクラスに次のフィールド宣言 (ボールド部分) を追加します。
public class Pavilion implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String name;
private String address;
private Collection <Animal> animals;
- 次の注釈を name の宣言の上に追加し、生成される列の名前を変更します。
@Column(name="pavilionName")
private String name;
- 次の注釈を animals コレクションの上に追加し、このエンティティーに「1 対多」の関係を指定します。
@OneToMany(mappedBy="pavilion")
private Collection <Animal> animals;
- エディタ内を右クリックして「コードを挿入」(Alt-Insert) を選択し、「取得メソッドおよび設定メソッド」を選択します。
- 「取得メソッドおよび設定メソッドの生成」ダイアログですべてのフィールドを選択し、「生成」をクリックします。
- Animal クラスのときと同様に、マージンにある警告アイコンをクリックし、「フィールドアクセスの単一化」を選択します。
- Alt-Shift-I キーを押して、足りないインポート文を生成します。
- 変更を保存します。
まとめ
この課題では、2 つのエンティティークラスを作成し、フィールドを定義しました。また、注釈を使用して、アプリケーションの配備時に生成される表の列の一部に対してプロパティーを定義しました。
Web インタフェースの作成
今度は、データベース表が作成されたかどうか、また、データを追加できるかどうかを確認するための、簡単な Web ページをいくつか作成します。Java Server Faces (JSF) ページをアプリケーションに追加し、「エンティティークラスからの JSF ページ」ウィザードを使用して簡単な Web インタフェースをすばやく作成します。
- メインメニューから「ファイル」>「新規」を選択します。「持続性」カテゴリの「エンティティークラスからの JSF ページ」を選択し、「次へ」をクリックします。
- 「新規 エンティティークラスからの JSF ページ」ウィザードで、「すべてを追加」をクリックして 2 つのエンティティークラスを選択し、「次へ」をクリックします。
- JSF ファイルをデフォルトの場所に保存するために、「JSF ページのフォルダ」テキストフィールドは空のままにしておきます。
- 生成されるクラスのパッケージとして entity を指定し、「完了」をクリックします。

「完了」をクリックすると、必要な JavaServer Faces ファイルが生成され、ZooApp を実行およびテストできるようになります。
プロジェクトの実行
この課題では、ZooApp Web アプリケーションプロジェクトを配備し、アプリケーションをテストします。
- 「サービス」ウィンドウで「JavaDB」ノードを右クリックし、「サーバーを起動」を選択して、Java DB データベースを起動します。
- 「ZooApp」プロジェクトノードを右クリックし、「プロジェクトを実行」を選択します。
「実行」をクリックすると、飼育棟と動物の一覧が確認できるメニューの付いたページがブラウザで開きます。
リンクをクリックして、動物や飼育棟のデータを表示、追加、編集、または削除できます。
まとめ
この課題では、Java EE 5 プラットフォームで開発した ZooApp Web アプリケーションの構築を行いました。続いて、ZooApp Web アプリケーションの配備とテストを行いました。
トラブルシューティング
プロジェクト作成時に発生する可能性がある問題の一部を次に示します。
「新規 エンティティークラスからの JSF ページ」に関する問題
ウィザードを使用してエンティティークラスから JSF ページを作成しようとすると、ウィザードに次のエラーメッセージが表示されることがあります。
このウィザードは、JSF をサポートしている Web プロジェクトでしか使用できません。
このメッセージが表示された場合、Java Server Faces フレームワークがプロジェクトプロパティーに追加されていることを確認する必要があります。次の手順を実行することによって、Web プロジェクトに Java Server Faces サポートを追加できます。
- 「プロジェクト」ウィンドウで対象の Web アプリケーションノードを右クリックし、「プロパティー」を選択します。
- 「プロジェクトプロパティー」ダイアログの「カテゴリ」区画で「フレームワーク」を選択し、「追加」をクリックします。
- 「Select Frameworks」ダイアログで「Java Server Faces」を選択して「了解」をクリックします。
- 「プロジェクトプロパティー」ダイアログの「了解」をクリックして、ウィンドウを閉じます。
プロジェクトプロパティーに「JSF フレームワーク」を追加したあとは、ウィザードを使用して JSF ページを作成できるはずです。
Pavilion データの変更時に IllegalArgumentException が発生する問題
次の例外が発生する場合があります。
java.lang.IllegalArgumentException: Expected a child component type of UISelectItem/UISelectItems for component type javax.faces.SelectMany(animals). Found null.
この場合、Pavilion クラスの Collection <Animal> の取得メソッドと設定メソッドが間違っている可能性があります。
Collection <Animal> の取得メソッドと設定メソッドが次のようになっていることを確認してください。
public Collection<Animal> getAnimals() {
return animals;
}
public void setAnimals(Collection<Animal> animals) {
this.animals = animals;
}
プロジェクトの取得メソッドと設定メソッドが正しくない場合は、次の手順に従います。
- エンティティークラスのコントローラクラスとコンバータクラスを削除します。
- 「プロジェクト」ウィンドウの「Web ページ」ノードの下にある animal と pavilion の各ディレクトリを削除します。
- Pavilion エンティティークラスの取得メソッドと設定メソッドを修正します。
- 「エンティティークラスからの JSF ページ」ウィザードを使用して、JSF ページ、およびコントローラクラスとコンバータクラスを再生成します。
次の手順
NetBeans IDE 5.5 を使用した Java EE アプリケーションの開発方法についての詳細は、次のリソースを参照してください。
Java Persistence の使用方法については、Java EE 5 チュートリアルを参照してください。
nbj2ee メーリングリストに登録する ことによって、NetBeans IDE Java EE 開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。