corner imagecorner image
FeaturesPluginsDocs & SupportCommunityPartners

>> Visual Web Pack のほかのドキュメント

NetBeans Visual Web Pack での Hibernate の使用

2007 年 5 月 [Revision number: V5.5.1-1]    

このチュートリアルでは、NetBeans Visual Web Pack プロジェクトでの Hibernate フレームワークの使用方法について説明します。 また、Option 型配列および ObjectListDataProvider オブジェクトを使用してバックエンドデータをラップし、JavaServer Faces コンポーネントにバインドする方法も示します。

目次

Hibernate と NetBeans Visual Web Pack
Hibernate クラスライブラリの作成
データベースへの Hibernate フロントエンドの準備
Hibernate フレームワークを使用した Visual Web プロジェクトの作成
「Person」リストの Option 型配列ラッパーの追加
「Trips」リストのオブジェクトリストデータプロバイダラッパーの追加
データラッパーへのコンポーネントのバインド
トラブルシューティングのヒント
  このページの情報は NetBeans 5.5 および 5.5.1 の Visual Web Pack が対象です。

このチュートリアルで使用している例

» HibernateTravelPOJO.zip

このチュートリアルでは、次のテクノロジとリソースを使用します。

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アプリケーションの構築のための推奨方法です。
  1. ライブラリマネージャーツールを使用して、必要な Hibernate ライブラリを IDE で使用できるようにします。 これを行うと、必要な Hibernate ライブラリを簡単かつ迅速にプロジェクトに追加できます。
  2. データベース表に使用する Hibernate 持続性コードを、再利用可能な Hibernate フロントエンドに分離する、Java Class Library プロジェクト (POJO プロジェクト) を作成します。
  3. データベースドライバおよび必要な Hibernate ライブラリを POJO プロジェクトに追加します。
  4. POJO プロジェクトおよび Hibernate ライブラリを参照する Visual Web アプリケーションプロジェクトを開発します。
  5. ラッパークラスを使用して、Hibernate 持続性クラスにコンポーネントを接続します。

Hibernate クラスライブラリの作成

このチュートリアルでは、まず、Hibernate ライブラリファイルをダウンロードし、ライブラリマネージャーツールを使用して必要な Hibernate ライブラリを IDE で使用できるようにします。
  1. www.hibernate.org から hibernate-3.2.2.ga.zip をダウンロードし、ファイルを展開します。 注: このチュートリアルの例では、Hibernate 3.2.2 およびこのバージョンで提供される、関連付けられた JAR ファイルを使用します。 違うバージョンを使用している場合は、JAR ライブラリ名およびバージョン番号が異なる場合があります。 また、追加する JAR ライブラリのリストも違うことがあります。
  2. IDE で、メインメニューから「ツール」>「ライブラリマネージャー」を選択します。
  3. 「新規ライブラリ」をクリックし、「ライブラリ名」フィールドに「Hibernate322」と入力して「了解」をクリックします。
  4. 「JAR/フォルダを追加」をクリックして、Hibernate のファイルを展開したディレクトリに移動します。
  5. hibernate3.jar を選択し、Enter キーを押します。
  6. 「JAR/フォルダを追加」を再度クリックし、lib サブディレクトリに移動します。
  7. 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 ライブラリを表示した「ライブラリマネージャー」ウィンドウ
    図 1: Hibernate ライブラリを表示した「ライブラリマネージャー」ウィンドウ
  8. アプリケーションを Tomcat サーバーに配備する場合は、Hibernate lib ディレクトリの jta.jar も追加する必要があります。
  9. Java エディタで Hibernate Javadoc を使用可能にするには、「Javadoc」タブを選択し、「ZIP/フォルダを追加」をクリックして、Hibernate のファイルを展開したディレクトリに移動したあと、doc/api サブディレクトリを選択して Enter キーを押します。
  10. (省略可能) デバッグセッション中に Hibernate クラスをステップインする場合、「ソース」タブをクリックし、「JAR/フォルダを追加」をクリックして、Hibernate ファイルを展開したディレクトリに移動したあと、src サブディレクトリを選択して Enter キーを押します。
  11. 「了解」をクリックしてライブラリマネージャーを閉じます。

データベースへの Hibernate フロントエンドの準備

データベースにアクセスする Hibernate コードは、別のプロジェクトに分離することをお勧めします。 HibernateTravelPOJO.zip ファイルには、HibernateTravelPOJO プロジェクトが含まれています。これは、Travel データベースにアクセスするための Hibernate フロントエンドです。 Visual Web プロジェクトが Hibernate マッピングを介して Travel データベースにアクセスできるよう、プロジェクトに HibernateTravelPOJO をライブラリ依存としてインポートできます。 「Introduction to Hibernate」で説明しているように、HibernateTravelPOJO プロジェクトには、必要なマッピングファイル、構成ファイル、ユーティリティークラス、および POJO 持続クラスが含まれます。 次の図にプロジェクトの内容を示します。

図 2: HibernateTravelPOJO プロジェクトの内容
図 2: HibernateTravelPOJO プロジェクトの内容

注: 簡単にするため、HibernateTravelPOJO は、Travel データベースの完全なフロントエンドのサブセットとなっていて、チュートリアルのプロジェクトに必要なクラス、プロパティー、および関係のみが含まれています。
  1. ホームディレクトリの下の NetBeansProjects フォルダまたは任意のディレクトリに HibernateTravelPOJO.zip ファイルの内容を展開します。
  2. IDE で開いているプロジェクトをすべて閉じます。
  3. 「ファイル」>「プロジェクトを開く」を選択し、HibernateTravelPOJO プロジェクトを開きます。
  4. 「プロジェクト」ウィンドウで「HibernateTravelPOJO」ノードを展開し、「ライブラリ」ノードを右クリックしてポップアップメニューから「ライブラリを追加」を選択します。
  5. 「ライブラリを追加」ダイアログで、「Hibernate322」を選択し、「ライブラリを追加」をクリックします。
  6. 「ライブラリ」ノードをもう一度右クリックし、ポップアップメニューから「JAR/フォルダを追加」を選択します。
  7. Travel データベースのサーバーとして、JavaDB ネットワーククライアントの derbyclient.jar に移動して選択します。 Sun Java System Application Server の場合、この JAR ファイルは <Sun Java System Application Server のインストールディレクトリ>/javadb/lib/derbyclient.jar です。

    別のデータベースサーバーを使用している場合は、そのサーバーのクライアントに移動して選択します。
  8. Enter キーを押します。

    これでデータベースドライバでデータベースに Hibernate 接続ができるようになりました。
  9. ポート番号 1527 (デフォルト) 以外のポート番号を使用している場合、あるいは異なるデータベースを使用している場合は、「HibernateTravelPOJO」>「ソースパッケージ」>「デフォルトパッケージ」>「hibernate.cfg.xml」構成ファイル内の「hibernate.connection.url」プロパティーを編集します。

    データベースのポート番号を確認するには、「実行時」ウィンドウで Travel データベースの jdbc ノードを参照します。 ホスト名のあとにポート番号が表示されます。 Travel データベースが使用できない場合は、『NetBeans Visual Web Pack 5.5 インストール』の「構成情報」の節を参照してください。
  10. 「プロジェクト」ウィンドウで、「HibernateTravelPOJO」ノードを右クリックし、「プロジェクトを構築」を選択します。

Hibernate フレームワークを使用した Web プロジェクトの作成

この節では、Visual Web プロジェクトを作成し、作成した Web プロジェクトに HibernateTravelPOJO Java クラスプロジェクトを追加します。 次の図に、このプロジェクトで構築する Web ページを示します。

図 3: HibernateTutorialApp の Page1
図 3: HibernateTutorialApp の Page1
  1. 「実行時」ウィンドウで、「データベース」ノードを展開します。
  2. Travel データベースの jdbc ノードを右クリックし、ポップアップメニューから「接続」を選択します。
  3. 「接続」ダイアログで、パスワードに「travel」と入力し、「セッション中はパスワードを保存」を選択して、「了解」をクリックします。
  4. メインメニューから「ファイル」>「新規プロジェクト」を選択します。
  5. 「新規プロジェクト」ウィザードで、「カテゴリ」リストから「Web」を選択し、「プロジェクト」リストから「Visual Web アプリケーション」を選択します。
  6. 「次へ」をクリックします。
  7. プロジェクトに「HibernateTutorialApp」という名前を付け、サーバーと Java EE のバージョンを選択し、「完了」をクリックします。

    ビジュアルデザイナーに最初のページ (Page1) が表示された状態でプロジェクトが開きます。
  8. 「プロジェクト」ウィンドウで、「HibernateTutorialApp」>「ライブラリ」を右クリックし、「ライブラリを追加」を選択します。
  9. 次の図に示すように、「ライブラリを追加」ウィンドウで、「Hibernate322」を選択して「ライブラリを追加」をクリックします。

    図 4: Hibernate ライブラリの追加
    図 4: Hibernate ライブラリの追加
  10. 「HibernateTutorialApp」>「ライブラリ」をもう一度右クリックし、「プロジェクトを追加」を選択します。
  11. 次の図に示すように、「プロジェクトを追加」ウィンドウで、「HibernateTravelPOJO」に移動して選択し、「プロジェクト JAR ファイルを追加」をクリックします。

    図 5: HibernateTravelPOJO プロジェクトの追加
    図 5: HibernateTravelPOJO プロジェクトの追加
  12. 「パレット」から「ドロップダウンリスト」コンポーネントをドラッグして、ビジュアルデザイナーの Page1 の左上隅にドロップします。
  13. Page1 に追加したドロップダウンリストコンポーネントをダブルクリックします。

    ドロップダウンリストの選択内容の変更を処理するメソッドが IDE によって追加され、メソッドがソースエディタに表示されます。 また、このメソッドは、値変更イベントのハンドラとして登録されます。 あとでこのメソッドにコードを追加します。
  14. 編集用ツールバーの「デザイン」をクリックして、ビジュアルデザイナーに切り替えます。
  15. このドロップダウンリストコンポーネントを右クリックし、ポップアップメニューから「変更時に自動送信」を選択します。

    この作業により、ユーザーがドロップダウンリストから新しい値を選択するたびに、ブラウザがページを送信します。
  16. 「メッセージグループ」コンポーネントをドラッグして、ドロップダウンリストコンポーネントの右側にドロップします。

    メッセージグループコンポーネントは、実行時の問題の診断に役立ちます。
  17. 「表」コンポーネントをドラッグして、ドロップダウンリストコンポーネントの下にドロップします。

「Person」リストの Option 型配列ラッパーの追加

この節では、セッション Bean にビジネスロジックを追加し、プロジェクトが Hibernate フレームワークを使用して「Person」データソースにアクセスできるようにします。 まず、ドロップダウンリストコンポーネントで使用する Option オブジェクトの配列を保持するセッション Bean プロパティーを追加します。 次に、Person データベース表に対するクエリーの結果を Option オブジェクトの配列に格納するコードを追加します。
  1. 「アウトライン」ウィンドウで「SessionBean1」を右クリックして、ポップアップメニューから「追加」>「プロパティー」を選択します。

    「追加」メニュー項目が無効になっている場合は、ポップアップウィンドウを閉じ、もう一度右クリックしてください。
  2. 「新規プロパティーパターン」ダイアログで、「名前」テキストボックスに「personOptions」と入力し、「型」テキストボックスに「Option[]」と入力して、「了解」をクリックします。

    新しく追加したプロパティーは「アウトライン」ウィンドウに表示されない場合があります。 この場合、次の手順に従い、SessionBean1 ソースファイルを開いて保存すると、プロパティーは表示されます。
  3. 「SessionBean1」ノードをダブルクリックして、SessionBean1.java ソースファイルを開きます。

    未解決のクラスが発生した結果、コードにはエラー注釈が表示されます。 この段階ではこの注釈を無視してもかまいません。 あとで「インポートを修正」アクションを使用してエラーを解決します。
  4. 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;
            }
        }
  5. ソース内で右クリックし、ポップアップメニューから「インポートを修正」を選択します。

    「インポートを修正」ダイアログが表示されます。
  6. 次の完全修飾名を選択して、「了解」をクリックします。

    クラス名 完全修飾名
    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
  7. ファイルを閉じて保存します。

「Trips」リストのオブジェクトリストデータプロバイダラッパーの追加

この節では、ObjectListDataProvider クラスを拡張し、trips クエリーの結果用の TripDataProvider ラッパーを構築します。
  1. 「プロジェクト」ウィンドウで、「HibernateTutorialApp」>「ソースパッケージ」>「hibernatetutorialapp」を右クリックし、「新規」>「Java クラス」を選択します。
  2. クラス名に「TripDataProvider」と入力し、「完了」をクリックします。

    「TripDataProvider.java」ノードが hibernatetutorialapp パッケージノードの下に表示され、IDE は TripDataProvider クラスのソースコードを表示します。
  3. クラスの定義を次のコードに置き換えます。

    コード例 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();
            }
        }
    }
  4. ソース内で右クリックし、ポップアップメニューから「インポートを修正」を選択します。
  5. 次の完全修飾名を選択して、「了解」をクリックします。

    クラス名 完全修飾名
    Session org.hibernate.Session
    Transaction   org.hibernate.Transaction
    Set java.util.Set
  6. ファイルを閉じて保存します。
  7. 「アウトライン」ウィンドウで「SessionBean1」ノードを右クリックして、ポップアップメニューから「追加」>「プロパティー」を選択します。
  8. 「新規プロパティーパターン」ダイアログで、「名前」テキストボックスに「tripDataProvider」と入力し、「型」テキストボックスに「TripDataProvider」と入力して、「了解」をクリックします。
  9. 「SessionBean1」ノードをダブルクリックして、SessionBean1.java ソースファイルを開きます。
  10. 「ナビゲータ」ウィンドウで、「tripDataProvider」ノードをダブルクリックします。

    IDE により、tripDataProvider プロパティーの宣言までソースコードがスクロールされます。
  11. tripDataProvider プロパティーの宣言を次の文に置き換えます。

    private TripDataProvider tripDataProvider = new TripDataProvider();
  12. F11 キーを押して、プロジェクトを構築します。
  13. プロジェクトを一度閉じて、再度開きます。

    利用可能なデータプロバイダのリストに新規データプロバイダを表示させるには、プロジェクトを一度閉じて再度開く必要があります。

データラッパーへのコンポーネントのバインド

この節では、データラッパーにコンポーネントをバインドし、選択された人に対して表コンポーネントのデータを同期するロジックを追加します。
  1. ビジュアルデザイナで Page1 を開きます。
  2. ドロップダウンリストコンポーネントを右クリックし、ポップアップメニューから「データにバインド」を選択します。
  3. 「オブジェクトにバインド」タブをクリックし、「SessionBean1」>「personOptions」を選択して、「了解」をクリックします。
  4. 「表」コンポーネントを右クリックし、ポップアップメニューから「表レイアウト」を選択します。
  5. 「データの入手先」ドロップダウンリストから「tripDataProvider」を選択します。

    注:ドロップダウンリストに「tripDataProvider」が表示されない場合は、プロジェクトを構築して一度閉じ、再度開いてから、もう一度試してください。
  6. 「選択」リストの「personId」を選択し、左矢印 左矢印ボタン ボタンをクリックして、「選択」リストから「使用可能」リストにフィールドを移動します。
  7. 図 6 に示すように、「上へ」および「下へ」ボタンを使用して、次の順で残りのフィールドを配置して、「了解」をクリックします。

    • tripId
    • depDate
    • depCity
    • destCity
    • tripTypeId

    図 6: tripDataProvider ラッパーへの表コンポーネントのバインド
    図 6: tripDataProvider ラッパーへの表コンポーネントのバインド
  8. 編集ツールバーの「Java」をクリックして、Java エディタで Page1.java を開きます。
  9. 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());
            }
        }

    このコードにより、ユーザーが最初にページにアクセスしたときに、ドロップダウンリストの最初の人の情報が表示されます。
  10. ソース内で右クリックし、ポップアップメニューから「インポートを修正」を選択します。

    「インポートを修正」ダイアログが表示されます。
  11. 完全修飾名ドロップダウンリストで、Java EE 5 プロジェクトの場合は「com.sun.webui.jsf.model.Option」、J2EE 1.4 プロジェクトの場合は「com.sun.rave.web.ui.model.Option」を選択します。
  12. 「了解」をクリックします。
  13. 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());
            }
        }
     
    このコードにより、選択された人の旅行情報がページに表示されます。
  14. メインツールバーで「主プロジェクトを実行」をクリックしてプロジェクトを実行します。
  15. ドロップダウンリストから人の名前を選択し、その人の旅行情報を表示します。

トラブルシューティングのヒント

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 日


Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   GlassFish Community: an Open Source Application Server   Open Solaris  Open JDK: an Open SourceJDK   Mobile & Embedded Community     Sponsored by 
Sponsored by Sun Microsystems