>> Visual Web Pack のほかのドキュメント
NetBeans Visual Web Pack での Hibernate の使用
執筆: Chris Kutler、Craig McClananan、John Baker
| 2007 年 5 月 [Revision number: V5.5.1-1] |
|
|
このチュートリアルでは、NetBeans Visual Web Pack プロジェクトでの Hibernate フレームワークの使用方法について説明します。 また、Option 型配列および ObjectListDataProvider オブジェクトを使用してバックエンドデータをラップし、JavaServer Faces コンポーネントにバインドする方法も示します。 |
目次
|
|
 |
このチュートリアルでは、次のテクノロジとリソースを使用します。
JavaServer Faces コンポーネント / Java EE プラットフォーム |
Java EE 5* の場合、1.2 J2EE 1.4 の場合、1.1
|
| Travel データベース |
必須 |
| BluePrints AJAX コンポーネントライブラリ |
任意 |
* このチュートリアルの公開時点で Java EE 5 をサポートしていたのは Sun Java System Application Server だけです。
このチュートリアルは、Sun Java System Application Server PE 9.0 Update Release 1 と Tomcat 5.5.17 を使用することを想定しています。 別のサーバーを使用している場合は、「リリースノート」と「FAQ」(または「日本語 FAQ」) で既知の問題やその回避策を確認してください。 サポートされているサーバーと Java EE プラットフォームについては、「リリースノート」を参照してください。
Hibernate と NetBeans Visual Web Pack
Hibernate は、オブジェクト/関係の持続性およびクエリーサービスを提供するオープンソースツールです。 Hibernate は、アプリケーションとデータベースの間に位置し、オブジェクトの読み込みと保存をシームレスに行って、持続性のある内容管理を支援します。
このチュートリアルでは、Hibernate ライブラリおよび通常の Java オブジェクト (POJO) を使用した Visual Web アプリケーションを構築する方法を説明します。 このチュートリアルは、Hibernate についての確かな知識を持っている開発者向けです。 Hibernate については、Hibernate 関連ドキュメントを参照してください。
このチュートリアルでは、model.Option オブジェクトの配列を使用して Person POJO をラップし、この配列にドロップダウンリストコンポーネントをバインドします。 さらに ObjectListDataProvider クラスを拡張して、Trips POJO に TripDataProvider ラッパーを構築し、TripDataProvider クラスのインスタンスに表コンポーネントをバインドします。
注: model.Option クラスについては、「リストボックスコンポーネント」を参照してください。
このチュートリアルでは、次の手順を行います。 これらの手順は、Hibernate フレームワークを使用した Visual Webアプリケーションの構築のための推奨方法です。
- ライブラリマネージャーツールを使用して、必要な Hibernate ライブラリを IDE で使用できるようにします。 これを行うと、必要な Hibernate ライブラリを簡単かつ迅速にプロジェクトに追加できます。
- データベース表に使用する Hibernate 持続性コードを、再利用可能な Hibernate フロントエンドに分離する、Java Class Library プロジェクト (POJO プロジェクト) を作成します。
- データベースドライバおよび必要な Hibernate ライブラリを POJO プロジェクトに追加します。
- POJO プロジェクトおよび Hibernate ライブラリを参照する Visual Web アプリケーションプロジェクトを開発します。
- ラッパークラスを使用して、Hibernate 持続性クラスにコンポーネントを接続します。
Hibernate クラスライブラリの作成
このチュートリアルでは、まず、Hibernate ライブラリファイルをダウンロードし、ライブラリマネージャーツールを使用して必要な Hibernate ライブラリを IDE で使用できるようにします。
- www.hibernate.org から
hibernate-3.2.2.ga.zip をダウンロードし、ファイルを展開します。 注: このチュートリアルの例では、Hibernate 3.2.2 およびこのバージョンで提供される、関連付けられた JAR ファイルを使用します。 違うバージョンを使用している場合は、JAR ライブラリ名およびバージョン番号が異なる場合があります。 また、追加する JAR ライブラリのリストも違うことがあります。
- IDE で、メインメニューから「ツール」>「ライブラリマネージャー」を選択します。
- 「新規ライブラリ」をクリックし、「ライブラリ名」フィールドに「
Hibernate322」と入力して「了解」をクリックします。
- 「JAR/フォルダを追加」をクリックして、Hibernate のファイルを展開したディレクトリに移動します。
hibernate3.jar を選択し、Enter キーを押します。
- 「JAR/フォルダを追加」を再度クリックし、
lib サブディレクトリに移動します。
- Ctrl キーを押しながら、次の 10 個の JAR ファイルをクリックして選択し、Enter キーを押します。 3.2.2 以外のバージョンを使用している場合は、Hibernate の Web サイトで、選択する JAR ファイルを確認してください。
ant-1.6.5.jar
antlr-2.7.6.jar
asm-attrs.jar
asm.jar
cglib-2.1.3.jar
commons-logging-1.0.4.jar
commons-collections-2.1.1.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
jdbc2_0-stdext.jar
次の図に、「ライブラリマネージャー」ウィンドウの Hibernate ライブラリを示します。
 図 1: Hibernate ライブラリを表示した「ライブラリマネージャー」ウィンドウ |
- アプリケーションを Tomcat サーバーに配備する場合は、Hibernate
lib ディレクトリの jta.jar も追加する必要があります。
- Java エディタで Hibernate Javadoc を使用可能にするには、「Javadoc」タブを選択し、「ZIP/フォルダを追加」をクリックして、Hibernate のファイルを展開したディレクトリに移動したあと、
doc/api サブディレクトリを選択して Enter キーを押します。
- (省略可能) デバッグセッション中に Hibernate クラスをステップインする場合、「ソース」タブをクリックし、「JAR/フォルダを追加」をクリックして、Hibernate ファイルを展開したディレクトリに移動したあと、
src サブディレクトリを選択して Enter キーを押します。
- 「了解」をクリックしてライブラリマネージャーを閉じます。
データベースへの Hibernate フロントエンドの準備
データベースにアクセスする Hibernate コードは、別のプロジェクトに分離することをお勧めします。 HibernateTravelPOJO.zip ファイルには、HibernateTravelPOJO プロジェクトが含まれています。これは、Travel データベースにアクセスするための Hibernate フロントエンドです。 Visual Web プロジェクトが Hibernate マッピングを介して Travel データベースにアクセスできるよう、プロジェクトに HibernateTravelPOJO をライブラリ依存としてインポートできます。 「Introduction to Hibernate」で説明しているように、HibernateTravelPOJO プロジェクトには、必要なマッピングファイル、構成ファイル、ユーティリティークラス、および POJO 持続クラスが含まれます。 次の図にプロジェクトの内容を示します。
 図 2: HibernateTravelPOJO プロジェクトの内容 |
注: 簡単にするため、HibernateTravelPOJO は、Travel データベースの完全なフロントエンドのサブセットとなっていて、チュートリアルのプロジェクトに必要なクラス、プロパティー、および関係のみが含まれています。
- ホームディレクトリの下の
NetBeansProjects フォルダまたは任意のディレクトリに HibernateTravelPOJO.zip ファイルの内容を展開します。
- IDE で開いているプロジェクトをすべて閉じます。
- 「ファイル」>「プロジェクトを開く」を選択し、HibernateTravelPOJO プロジェクトを開きます。
- 「プロジェクト」ウィンドウで「HibernateTravelPOJO」ノードを展開し、「ライブラリ」ノードを右クリックしてポップアップメニューから「ライブラリを追加」を選択します。
- 「ライブラリを追加」ダイアログで、「Hibernate322」を選択し、「ライブラリを追加」をクリックします。
- 「ライブラリ」ノードをもう一度右クリックし、ポップアップメニューから「JAR/フォルダを追加」を選択します。
-
Travel データベースのサーバーとして、JavaDB ネットワーククライアントの derbyclient.jar に移動して選択します。 Sun Java System Application Server の場合、この JAR ファイルは <Sun Java System Application Server のインストールディレクトリ>/javadb/lib/derbyclient.jar です。
別のデータベースサーバーを使用している場合は、そのサーバーのクライアントに移動して選択します。
-
Enter キーを押します。
これでデータベースドライバでデータベースに Hibernate 接続ができるようになりました。
-
ポート番号 1527 (デフォルト) 以外のポート番号を使用している場合、あるいは異なるデータベースを使用している場合は、「HibernateTravelPOJO」>「ソースパッケージ」>「デフォルトパッケージ」>「hibernate.cfg.xml」構成ファイル内の「hibernate.connection.url」プロパティーを編集します。
データベースのポート番号を確認するには、「実行時」ウィンドウで Travel データベースの jdbc ノードを参照します。 ホスト名のあとにポート番号が表示されます。 Travel データベースが使用できない場合は、『NetBeans Visual Web Pack 5.5 インストール』の「構成情報」の節を参照してください。
- 「プロジェクト」ウィンドウで、「HibernateTravelPOJO」ノードを右クリックし、「プロジェクトを構築」を選択します。
Hibernate フレームワークを使用した Web プロジェクトの作成
この節では、Visual Web プロジェクトを作成し、作成した Web プロジェクトに HibernateTravelPOJO Java クラスプロジェクトを追加します。 次の図に、このプロジェクトで構築する Web ページを示します。
 図 3: HibernateTutorialApp の Page1 |
- 「実行時」ウィンドウで、「データベース」ノードを展開します。
-
Travel データベースの jdbc ノードを右クリックし、ポップアップメニューから「接続」を選択します。
- 「接続」ダイアログで、パスワードに「
travel」と入力し、「セッション中はパスワードを保存」を選択して、「了解」をクリックします。
- メインメニューから「ファイル」>「新規プロジェクト」を選択します。
- 「新規プロジェクト」ウィザードで、「カテゴリ」リストから「Web」を選択し、「プロジェクト」リストから「Visual Web アプリケーション」を選択します。
- 「次へ」をクリックします。
プロジェクトに「HibernateTutorialApp」という名前を付け、サーバーと Java EE のバージョンを選択し、「完了」をクリックします。
ビジュアルデザイナーに最初のページ (Page1) が表示された状態でプロジェクトが開きます。
- 「プロジェクト」ウィンドウで、「HibernateTutorialApp」>「ライブラリ」を右クリックし、「ライブラリを追加」を選択します。
-
次の図に示すように、「ライブラリを追加」ウィンドウで、「Hibernate322」を選択して「ライブラリを追加」をクリックします。
 図 4: Hibernate ライブラリの追加 |
- 「HibernateTutorialApp」>「ライブラリ」をもう一度右クリックし、「プロジェクトを追加」を選択します。
次の図に示すように、「プロジェクトを追加」ウィンドウで、「HibernateTravelPOJO」に移動して選択し、「プロジェクト JAR ファイルを追加」をクリックします。
図 5: HibernateTravelPOJO プロジェクトの追加 |
- 「パレット」から「ドロップダウンリスト」コンポーネントをドラッグして、ビジュアルデザイナーの Page1 の左上隅にドロップします。
Page1 に追加したドロップダウンリストコンポーネントをダブルクリックします。
ドロップダウンリストの選択内容の変更を処理するメソッドが IDE によって追加され、メソッドがソースエディタに表示されます。 また、このメソッドは、値変更イベントのハンドラとして登録されます。 あとでこのメソッドにコードを追加します。
- 編集用ツールバーの「デザイン」をクリックして、ビジュアルデザイナーに切り替えます。
このドロップダウンリストコンポーネントを右クリックし、ポップアップメニューから「変更時に自動送信」を選択します。
この作業により、ユーザーがドロップダウンリストから新しい値を選択するたびに、ブラウザがページを送信します。
「メッセージグループ」コンポーネントをドラッグして、ドロップダウンリストコンポーネントの右側にドロップします。
メッセージグループコンポーネントは、実行時の問題の診断に役立ちます。
- 「表」コンポーネントをドラッグして、ドロップダウンリストコンポーネントの下にドロップします。
「Person」リストの Option 型配列ラッパーの追加
この節では、セッション Bean にビジネスロジックを追加し、プロジェクトが Hibernate フレームワークを使用して「Person」データソースにアクセスできるようにします。 まず、ドロップダウンリストコンポーネントで使用する Option オブジェクトの配列を保持するセッション Bean プロパティーを追加します。 次に、Person データベース表に対するクエリーの結果を Option オブジェクトの配列に格納するコードを追加します。
-
「アウトライン」ウィンドウで「SessionBean1」を右クリックして、ポップアップメニューから「追加」>「プロパティー」を選択します。
「追加」メニュー項目が無効になっている場合は、ポップアップウィンドウを閉じ、もう一度右クリックしてください。
「新規プロパティーパターン」ダイアログで、「名前」テキストボックスに「personOptions」と入力し、「型」テキストボックスに「Option[]」と入力して、「了解」をクリックします。
新しく追加したプロパティーは「アウトライン」ウィンドウに表示されない場合があります。 この場合、次の手順に従い、SessionBean1 ソースファイルを開いて保存すると、プロパティーは表示されます。
-
「SessionBean1」ノードをダブルクリックして、SessionBean1.java ソースファイルを開きます。
未解決のクラスが発生した結果、コードにはエラー注釈が表示されます。 この段階ではこの注釈を無視してもかまいません。 あとで「インポートを修正」アクションを使用してエラーを解決します。
-
SessionBean1 クラスの init メソッドの末尾に、次の太字のコードを追加します。
このコードは「Person」データソースに対してクエリーを呼び出し、personOptions 配列に結果を格納します。
コード例 1: セッション Bean の init メソッドでの personOptions 配列の初期化 |
public void init() {
// Perform initializations inherited from our superclass
super.init();
// Perform application initialization that must complete
// *before* managed components are initialized
// TODO - add your own initialization code here
...
// Perform application initialization that must complete
// *after* managed components are initialized
// TODO - add your own initialization code here
List personList = null;
try{
Session session =
HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Person");
personList = (List) q.list();
} catch(Exception e){
e.printStackTrace();
}
personOptions = new Option[personList.size()];
Iterator iter = personList.iterator();
int i=0;
while (iter.hasNext()) {
Person person = (Person) iter.next();
Option opt = new Option("" + person.getPersonId(),
person.getName());
personOptions[i++] = opt;
}
} |
-
ソース内で右クリックし、ポップアップメニューから「インポートを修正」を選択します。
「インポートを修正」ダイアログが表示されます。
-
次の完全修飾名を選択して、「了解」をクリックします。
| クラス名 |
完全修飾名 |
Query |
org.hibernate.Query |
Session |
org.hibernate.Session |
List |
java.util.List |
Iterator |
java.util.Iterator |
Option |
com.sun.webui.jsf.model.Option (Java EE 5)
com.sun.rave.web.ui.model.Option (J2EE 1.4) |
Transaction |
org.hibernate.Transaction |
- ファイルを閉じて保存します。
「Trips」リストのオブジェクトリストデータプロバイダラッパーの追加
この節では、ObjectListDataProvider クラスを拡張し、trips クエリーの結果用の TripDataProvider ラッパーを構築します。
- 「プロジェクト」ウィンドウで、「HibernateTutorialApp」>「ソースパッケージ」>「hibernatetutorialapp」を右クリックし、「新規」>「Java クラス」を選択します。
-
クラス名に「TripDataProvider」と入力し、「完了」をクリックします。
「TripDataProvider.java」ノードが hibernatetutorialapp パッケージノードの下に表示され、IDE は TripDataProvider クラスのソースコードを表示します。
-
クラスの定義を次のコードに置き換えます。
コード例 2: TripDataProvider クラス |
public class TripDataProvider extends ObjectListDataProvider{
private ArrayList tripsList = new ArrayList();
// 注: Java SE 1.5 を使用する場合、警告を解消するために次のコードを使用すること
// private ArrayList<Trip> tripsList = new ArrayList<Trip>();
/** tripDataProvider の新しいインスタンスを作成する */
public TripDataProvider() {
// デザイン時用のダミーデータを設定する
tripsList.add(new Trip());
// リストをラップする
setList(tripsList);
}
public void refreshTripsList(Integer personId){
tripsList.clear();
try{
Session session =
HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Person person =
(Person)
session.load(Person.class, personId);
Set personTrips = (PersistentSet)person.getTrips();
tripsList.addAll(personTrips);
tx.commit();
} catch(Exception e){
e.printStackTrace();
}
}
} |
- ソース内で右クリックし、ポップアップメニューから「インポートを修正」を選択します。
-
次の完全修飾名を選択して、「了解」をクリックします。
| クラス名 |
完全修飾名 |
Session |
org.hibernate.Session |
Transaction |
org.hibernate.Transaction |
Set |
java.util.Set |
- ファイルを閉じて保存します。
- 「アウトライン」ウィンドウで「SessionBean1」ノードを右クリックして、ポップアップメニューから「追加」>「プロパティー」を選択します。
- 「新規プロパティーパターン」ダイアログで、「名前」テキストボックスに「
tripDataProvider」と入力し、「型」テキストボックスに「TripDataProvider」と入力して、「了解」をクリックします。
- 「SessionBean1」ノードをダブルクリックして、
SessionBean1.java ソースファイルを開きます。
-
「ナビゲータ」ウィンドウで、「tripDataProvider」ノードをダブルクリックします。
IDE により、tripDataProvider プロパティーの宣言までソースコードがスクロールされます。
-
tripDataProvider プロパティーの宣言を次の文に置き換えます。
private TripDataProvider tripDataProvider = new TripDataProvider();
- F11 キーを押して、プロジェクトを構築します。
-
プロジェクトを一度閉じて、再度開きます。
利用可能なデータプロバイダのリストに新規データプロバイダを表示させるには、プロジェクトを一度閉じて再度開く必要があります。
データラッパーへのコンポーネントのバインド
この節では、データラッパーにコンポーネントをバインドし、選択された人に対して表コンポーネントのデータを同期するロジックを追加します。
- ビジュアルデザイナで Page1 を開きます。
- ドロップダウンリストコンポーネントを右クリックし、ポップアップメニューから「データにバインド」を選択します。
- 「オブジェクトにバインド」タブをクリックし、「SessionBean1」>「personOptions」を選択して、「了解」をクリックします。
- 「表」コンポーネントを右クリックし、ポップアップメニューから「表レイアウト」を選択します。
-
「データの入手先」ドロップダウンリストから「tripDataProvider」を選択します。
注:ドロップダウンリストに「tripDataProvider」が表示されない場合は、プロジェクトを構築して一度閉じ、再度開いてから、もう一度試してください。
- 「選択」リストの「personId」を選択し、左矢印
ボタンをクリックして、「選択」リストから「使用可能」リストにフィールドを移動します。
- 図 6 に示すように、「上へ」および「下へ」ボタンを使用して、次の順で残りのフィールドを配置して、「了解」をクリックします。
- tripId
- depDate
- depCity
- destCity
- tripTypeId
図 6: tripDataProvider ラッパーへの表コンポーネントのバインド |
- 編集ツールバーの「Java」をクリックして、Java エディタで
Page1.java を開きます。
-
prerender メソッドに、次のコード (太字部分) を追加します。
コード例 3: prerender メソッド |
public void prerender() {
try {
if (dropDown1.getSelected() == null ) {
Option firstPerson = getSessionBean1().getPersonOptions()[0];
getSessionBean1().getTripDataProvider().refreshTripsList(
new Integer((String)firstPerson.getValue()));
}
} catch(Exception ex) {
log("Error Description", ex);
error(ex.getMessage());
}
} |
このコードにより、ユーザーが最初にページにアクセスしたときに、ドロップダウンリストの最初の人の情報が表示されます。
-
ソース内で右クリックし、ポップアップメニューから「インポートを修正」を選択します。
「インポートを修正」ダイアログが表示されます。
- 完全修飾名ドロップダウンリストで、Java EE 5 プロジェクトの場合は「
com.sun.webui.jsf.model.Option」、J2EE 1.4 プロジェクトの場合は「com.sun.rave.web.ui.model.Option」を選択します。
- 「了解」をクリックします。
-
dropDown1_processValueChange メソッドに次の太字のコードを追加します。
コード例 4: dropDown1_processValueChange メソッド |
public void dropDown1_processValueChange(ValueChangeEvent event) {
try {
Integer personId =
new Integer((String)dropDown1.getSelected());
getSessionBean1().getTripDataProvider().refreshTripsList(
personId);
} catch(Exception ex) {
log("Error getting Person List : ", ex);
error("Error getting Person List: " + ex.getMessage());
}
} |
このコードにより、選択された人の旅行情報がページに表示されます。
- メインツールバーで「主プロジェクトを実行」をクリックしてプロジェクトを実行します。
- ドロップダウンリストから人の名前を選択し、その人の旅行情報を表示します。
トラブルシューティングのヒント
Web アプリケーションが動作しない場合に、その問題を診断する方法についてのヒントをいくつか示します。
- アプリケーションの実行時に、表コンポーネントに「項目が見つかりませんでした。」と表示される場合、データベースサーバーが稼働しているかどうか、「実行時」ウィンドウから Travel データベースに接続しているかどうか、および
hibernate.cfg.xml ファイルのポート設定が正しいかどうかを確認します。 hibernate.cfg.xml を修正した場合、再構築する前にプロジェクトの生成物を削除する必要があります。
- アプリケーションから
java.lang.ExceptionInInitializerError HibernateTravelPOJO.HibernateUtil がスローされる場合、データベースが動作しているかどうかを確認します。 アプリケーションを Tomcat サーバーに配備する場合は、Hibernate322 ライブラリに jta.jar を追加したかどうかを確認します。
- ドロップダウンリストから別の人を選択しても、表コンポーネントに新規のデータが表示されない場合、Page1 のデザインビューを開き、ドロップダウンリストコンポーネントのポップアップメニューから「変更時に自動送信」項目が選択されているかどうかを確認します。
- アプリケーションから
java.lang.reflect.UndeclaredThrowableException at $Proxy64.createQuery(Unknown Source) がスローされる場合、antlr-1.6.5 ライブラリでなく、antlr-2.7.6 ライブラリが含まれているかどうかを確認します。
関連項目:
更新日: 2007 年 5 月 24 日