FeaturesPluginsDocs & SupportCommunityPartners

Web アプリケーションでの Java Persistence の使用

このドキュメントは、Web アプリケーションで Java Persistence API を使用する基本的な入門書で、Java[tm] Platform Enterprise Edition 5 (「Java EE 5」) テクノロジを使用する開発プロセスで、どのように Java アプリケーションの開発が簡略化されるかを示します。

このドキュメントでは、NetBeans IDE 6.0 を使用して、データベースにアクセスする Web アプリケーションを作成します。この Web アプリケーションでは、IDE を使用してデータベースの表に対応するエンティティークラスを生成します。そのあと、データベースの情報を表示するサーブレットを生成します。アプリケーションは、Java Persistence を使用してデータベースのトランザクションを管理します。

Java EE 1.4 を使用して、同じアプリケーションがどのように作成されたかについては、「NetBeans IDE 5.0 クイックスタートガイド (J2EE アプリケーション)」を参照してください。

予想される所要時間: 15 分

チュートリアルの課題

このページの内容は NetBeans IDE 6.0 が対象です

前提条件

このドキュメントは、次のテクノロジについて基本的な知識またはプログラミング経験を持つ読者を想定して書かれています。

  • Java プログラミング
  • NetBeans IDE

このチュートリアルに必要なソフトウェア

このチュートリアルでは、コンピュータに次のソフトウェアをインストールしておく必要があります。

  • NetBeans IDE 6.0 の「Web および Java EE」または「すべて」ダウンロード (ダウンロード)
  • Java Standard Development Kit (JDK) バージョン 5.0 またはバージョン 6.0 ( ダウンロード)
  • GlassFish V2 Application Server (IDE のフルダウンロードに付属) または Sun Java System Application Server Platform Edition 9 (ダウンロード)

Application Server を使用するための IDE の設定

このチュートリアル用に、Glassfish V2 または Sun Java System Application Server Platform Edition 9 のインスタンスを、IDE に登録する必要があります。この課題で、アプリケーションサーバーを IDE に登録します。

  1. メインメニューから「ツール」>「サーバー」を選択します。
  2. 「サーバーを追加」をクリックします。アプリケーションサーバー (GlassFish または Sun Java System Application Server) を選択し、インスタンスに名前を付けます。「次へ」をクリックします。
  3. アプリケーションサーバーのインストールディレクトリ (例: C:\Sun\Appserver ) を指定します。
  4. 「ローカルのデフォルトドメインを登録」ラジオボタンが選択された状態のままで、ドメインを選択します。
  5. 必要であれば、「次へ」をクリックして管理者のユーザー名とパスワードを入力します。IDE のユーザーディレクトリにユーザー名とパスワードを保存しない場合は、各フィールドを空白のままにしておきます。IDE は必要に応じて、いつでも情報を尋ねてきます。
    注: admin のデフォルトパスワードは adminadmin です。
  6. 「完了」をクリックします。サーバーが登録され、「サービス」ウィンドウの「サーバー」ノードの下に表示されます。

まとめ

この課題では、アプリケーションサーバーを IDE に登録しました。

Web アプリケーションプロジェクトの設定

Java EE 5 プラットフォームでのこの開発例では、EJB モジュールやセッション Bean が必要ないため、完全なエンタープライズアプリケーションは必要ありません。代わりに、簡単な Web アプリケーションを作成し、その Web アプリケーション内に直接エンティティークラスを置くことができます。

  1. 「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択します。「Web」カテゴリから「Web アプリケーション」を選択します。
  2. このプロジェクトを「CustomerBook」と名付け、サーバーを「GlassFish」または「Sun Java System Application Server」に、「Java EE バージョン」を「Java EE 5」にそれぞれ設定して、「完了」をクリックします。

まとめ

この課題では、エンティティークラスおよびサーブレットを含める Java EE 5 Web アプリケーションを作成しました。

Web アプリケーションのコーディング

通常、Web アプリケーションをコーディングする前に、いくつかの基本的な設定が必要です。これにはデータベースとの接続の確立と、接続プールおよびデータソースの作成が含まれます。IDE に付属の jdbc/sample データベースを使用しているので、このほとんどはすでに構成されています。データベースへの接続はすでに IDE に登録されており、接続プールとデータソースもすでに作成されています。「サービス」ウィンドウに、接続とデータソースのプロパティーを表示できます。

設定が完了すると、作業の多くをコンテナが行うため、Java EE 5 プラットフォームの開発ははるかに容易になります。コンテナが持続性を管理しているため、CMP マッピングの設定や検索メソッドの指定のために配備記述子を編集する必要はありません。事実、この例では、配備記述子は一切必要ありません。Java EE 5 プラットフォームでは、持続性は EJB コンポーネントに限定されません。Java EE 5 に導入されている Java Persistence API は、Web アプリケーションなど、EJB 以外のコンポーネントでも使用できます。

また、Java EE 5 テクノロジでは、J2EE 1.4 開発で求められた多数のボイラープレートコードも必要ありません。EJB 開発は効率化されているため、必要なインタフェースが減って、検索は単純になり、注釈によってコンポーネント定義とリソースインジェクションが単純で明確になっています。

持続性の管理

アプリケーション内の持続性を管理するには、持続性ユニットの作成と、使用するデータソースとエンティティーマネージャーの指定だけが必要です。エンティティーと持続性の管理作業は、コンテナに任せます。コンテナは、実行時にエンティティー Bean を検出します。

持続性ユニットは、 persistence.xml で定義することによって作成します。プロジェクトまたはモジュールに persistence.xml が存在しない場合、作成する必要があります。持続性ユニットは、「新規持続性ユニット」ウィザードを使用してプロジェクトに追加できます。このウィザードは、 persistence.xml の作成および持続性ユニットのプロパティーの定義に役立ちます。注: 「新規エンティティークラス」ウィザードで持続性ユニットを作成することもできます。エンティティークラス作成時に持続性ユニットが存在しない場合は、ウィザードからその作成を求められます。

  1. 「新規ファイル」(Ctrl-N) を選択し、「新規ファイル」ウィザードを開きます。
  2. 「持続性」カテゴリから「持続性ユニット」を選択し、「次へ」をクリックします。
  3. ウィザードが提案する持続性ユニットのデフォルト名のままにしておきます。
  4. 「持続性プロバイダ」ドロップダウンリストに含まれる TopLink (デフォルト) を使用します。

    デフォルトのプロバイダは TopLink Essential.jar です。TopLink Essential.jar には Java Persistence 用のライブラリが含まれています。エンティティーマネージャーは TopLink Essential.jar に置かれています。

  5. 「データソース」ドロップダウンリストに含まれるデフォルトの jdbc/sample データソースを使用します。

    デフォルトのデータソース jdbc/sample は、Sun Java System Application Server にバンドルされている Java DB データベースへの接続に使用されます。

  6. 「完了」をクリックします。
「新規持続性ユニット」ウィザード

「完了」をクリックすると、プロジェクトのための persistence.xml が作成され、ソースエディタに表示されます。ソースエディタのツールバーにある「XML」をクリックすると、 persistence.xml の XML 表示を確認できます。このファイルには、アプリケーションのエンティティーおよび持続性を管理するために Java EE 5 コンテナが必要とする情報がすべて含まれています。

エンティティークラスの作成

J2EE 1.4 プラットフォームで開発を行うときは、アプリケーションが単純な Web アプリケーションであっても、作成したエンティティー Bean を EJB モジュールに配置していました。各エンティティー Bean は複数のインタフェースを必要とし、 ejb-jar.xml で配備記述子を設定して、エンティティー Bean、インタフェース、各エンティティー Bean の持続性および検索クエリーを定義する必要がありました。

Java EE 5 では、エンティティー Bean を作成して EJB モジュールに配置する代わりに、簡単なエンティティークラスを使用でき、そのエンティティークラスは Java EE 5 アプリケーションのどこにでも配置できます。また、Java EE 5 アプリケーションのクラス作成も、注釈を使用してコンポーネントの定義やリソースの注入ができるため、J2EE 1.4 プラットフォームよりも容易です。

ここでは、「データベース」ウィザードの「エンティティークラス」を使用して、リレーショナルデータベースに基づいたエンティティークラスを作成します。

  1. メインメニューから「ツール」>「 データベース」>「Java DB サーバーを起動」を選択して、Java DB データベースを起動します。
  2. 「新規ファイル」(Ctrl-N) を選択し、「新規ファイル」ウィザードを開きます。「持続性」カテゴリの「データベース」から「エンティティークラス」を選択し、「次へ」をクリックします。
  3. 「データベース」ウィザードの「エンティティークラス」で、「データソース」ドロップダウンリストからデータベースのための jdbc/sample データソースを選択し、必要に応じてパスワードを指定します (パスワードは「app」と指定)。データソースを選択すると、「利用可能な表」区画に利用可能な表の一覧が表示されます。
  4. 「利用可能な表」から CUSTOMER 表を選択し、「追加」をクリックします。

    「追加」をクリックすると、選択した表に関連する表もすべて追加されます。この例では、 DISCOUNT_CODE 表も追加されます。DISCOUNT_CODE 表は、CUSTOMER 表によって参照されており、そのエンティティークラスは Customer エンティティークラスを生成する目的で生成される必要があるので、灰色表示になっています。「選択された表」区画で、灰色表示になっている表の上にマウスを置くと、灰色表示になっている表を参照する表の名前を示すツールチップが表示されます。

  5. 「次へ」をクリックします。

    このウィザードによって、選択した表とそれに関連する表が表示されます。また、選択した表に基づいて作成されるエンティティークラスもウィザードによって表示されます。生成するクラスの名前を変更する場合、「クラス名」フィールドに名前を入力できます。

  6. 生成されたクラスのパッケージとして ejb を指定し、「完了」をクリックします。
new entity classes from database wizard

「完了」をクリックすると、IDE によって CUSTOMER 表と CUSTOMER 表に関連する表に対して、エンティティークラスが生成されます。「プロジェクト」ウィンドウで ejb ソースパッケージを展開すると、IDE によって Java クラス Customer.javaDiscountCode.java が作成されたことがわかります。IDE によってデータベース表のそれぞれに 1 つずつ、つまり 2 つのクラスだけが作成されたことがわかります。

ソースエディタで Customer.java を見ると、このクラスをエンティティークラスとして宣言するために @Entity という注釈が使用されることがわかります。ほかの注釈は、エンティティークラスとそのプロパティーがマップされるデータベース表および列などの、追加情報を提供します。

また、エンティティー Bean に一般的に見られるボイラープレートコードの多くが消えています。Java EE 5 のエンティティークラスでは、ejbRemovesetMessagesetSessionContextejbActivate、および ejbPassivate のようなメソッドは必要ないためです。

サーブレットのコーディング

次に、Web アプリケーションにサーブレットを追加する必要があります。Java EE 5 では、サーブレットに対するリソース作成およびルックアップコードを追加する代わりに、リソースインジェクションを使用してこの作業をコンテナに移すことができます。注釈を使用するとサーブレットに直接リソースを注入でき、必要なリソースの作成と検索はコンテナによって管理されます。ここでは、持続性ユニットで指定されたエンティティーマネージャーを使用します。

  1. 「プロジェクト」ウィンドウでプロジェクトのノードを右クリックし、「新規」>「サーブレット」を選択します。
  2. 「新規サーブレット」ウィザードで、サーブレットに CustomerDetails という名前を付け、web という名前のパッケージに追加します。「完了」をクリックします。「完了」をクリックすると、ソースエディタに CustomerDetails.java が表示されます。
  3. ソースエディタで CustomerDetails.java を右クリックし、「持続性」>「エンティティーマネージャーを使用」を選択して、このクラスに「持続性コンテキスト」を注入します。IDE によって、サーブレットが使用する持続性ユニットを指定する次の注釈が追加されます。注釈は、クラス宣言の上に追加されます。
      @PersistenceContext(name = "persistence/LogicalName", unitName = "CustomerBookPU")
                        

    また、IDE によって、トランザクションの境界を管理するためのリソースを注入する次の注釈も追加されます。

      @Resource
      private javax.transaction.UserTransaction utx;

    エディタの折り畳みを展開すると、次に示すデフォルトの persist メソッドコードが、IDE によってサーブレットに追加されることが確認できます。

      public void persist(Object object) {
          try {
              Context ctx = (Context) new javax.naming.InitialContext().lookup("java:comp/env");
              utx.begin();
              EntityManager em =  (EntityManager) ctx.lookup("persistence/LogicalName");
              em.persist(object);
              utx.commit();
          } catch(Exception e) {
              Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught", e);
              throw new RuntimeException(e);
          }
      }

    このコードは、 @PersistenceContext によって定義された持続性ユニットと、エンティティーマネージャーのインスタンスを検索します。

  4. CustomerDetails.java で、前述の生成済み persist メソッドがエンティティーオブジェクトを参照するように変更します。完了後、変更したコードは次のようになります (太字で表示されたコードが変更された行)。
      public Customer findByID(Integer customerNr) {
            Customer customer = null;
            try {
                Context ctx = (Context) new javax.naming.InitialContext().lookup("java:comp/env");
                utx.begin();
                EntityManager em =  (EntityManager) ctx.lookup("persistence/LogicalName");
                customer = em.find(Customer.class, customerNr);
                utx.commit();
            } catch(Exception e) {
                Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught", e);
                throw new RuntimeException(e);
            }
            return customer;
        }
                    
  5. processRequest メソッド内のコードのコメントを解除し、次の太字で表示されたコードを追加します。
        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet CustomerDetails</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Search Customer Information</h1>");
            String customerNr = request.getParameter("customer_nr");
            if((customerNr != null) && !(customerNr.equals(""))) {
    
                Customer customer = findByID(new Integer(customerNr));
                if(customer != null){
                    out.println("Customer's info for nr. " + customerNr + ": " + customer.getName());
                }else{
                    out.println("Customer not found.");
                }
            }
            out.println("<form>");
            out.println("Customer number: <input type='text' name='customer_nr' />");
            out.println("<input type=submit value=Select />");
            out.println("</form>");
            out.println("</body>");
            out.println("</html>");
            out.close();
        }
                        
  6. Ctrl-Shift-I キーを押して、足りないインポート文を生成します。サーブレットには、カスタマエンティティークラス用のインポート文が必要です。

プロジェクトの実行

  1. 「プロジェクト」ウィンドウで CustomerBook プロジェクトノードを右クリックし、「プロパティー」を選択します。「プロジェクトプロパティー」ダイアログの「実行」パネルで、「相対 URL」フィールドに「 /CustomerDetails 」と入力し、「了解」をクリックします。
  2. プロジェクトノードを右クリックし、「プロジェクトを実行」を選択します。IDE によってアプリケーションサーバーが起動され、プロジェクトの構築が行われ、ブラウザに CustomerDetails ページが表示されます。
  3. 顧客番号のフィールドに ID 番号 (たとえば「1」) を入力し、「送信」をクリックします。その ID 番号を持つ顧客の名前がサーブレットに表示されます。
servlet displaying customer information

まとめ

この課題では、Java EE 5 テクノロジを使用して CustomerBook アプリケーションを構築しました。そのあとで、プロジェクトの配備と Web アプリケーションのテストを行いました。



関連項目

NetBeans IDE 6.0 を使用した Java EE アプリケーションの開発方法についての詳細は、次のリソースを参照してください。

nbj2ee メーリングリストに登録する ことによって、NetBeans IDE Java EE 開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。

Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   Open JDK: an Open SourceJDK   GlassFish Community: an Open Source Application Server    Mobile & Embedded Community    Open Solaris   java.net - The Source for Java Technology Collaboration   Virtual Box - full virtualizer  Open ESB - The Open Enterprise Service Bus Powered by