corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

データベースからの JavaServer Faces CRUD アプリケーションの生成

このチュートリアルでは、NetBeans IDE を使用してデータベース内のデータを表示する Web アプリケーションを生成して配備します。CRUD (作成、読み取り、更新、削除) 機能を備え、Java Persistence API (JPA) を使用してデータベーストランザクションを管理する Web アプリケーションを生成する方法について、このチュートリアルで学習します。ここでは、最初にデータベース内の表に基づいてエンティティークラスを作成し、次に「エンティティーからの JSF ページクラス」ウィザードを使用してエンティティークラスから JavaServer Faces (JSF) ページを作成します。

「エンティティーからの JSF ページクラス」ウィザードを使用すると、プロジェクト内のエンティティークラスに基づき、データベースを操作するための JSF ページを短時間で簡単に生成できます。ウィザードでは、生成される JSF ページで Ajax 機能を有効にするオプションもあります。ウィザードによって生成されるコードには、次の特徴があります。

  • コードの保守とカスタマイズが容易です。
  • すべての種類の関係、生成される ID と生成されない ID、および組み込み ID (外部キー列に対応する組み込み ID フィールドを含む) が処理されます。
  • 組み込み ID フィールドは必要に応じて読み取り専用で表示されます。
  • null 可能ではない列の違反を防止するために必要なチェック機能と、関連のエンティティー内で null 可能ではない列の違反を防止するための孤立チェック機能が含まれます。ウィザードによってエンティティークラスに注釈要素 nullable または optional が組み込まれます。
  • ユーザーが通常のページフローから外れてしまった場合 (複数のブラウザタブを操作している場合など) にエラーを防止するため、現在のエンティティーが正しいことを確認するチェックが含まれます。
  • あとでデータベーススキーマを変更する必要が生じた場合に備えて、特定ファイル内のプロパティーごとのコードが省略されます。
  • カスタマイズを簡略化するため、生成された JSP からフィールドを簡単に削除できます。
  • ほかのユーザーによって削除されているエンティティーを操作しようとしたり、すでに存在するエンティティーを作成しようとしたりする状況を適切に処理します。
  • ページのスタイルを簡単に設定できます。

「エンティティーからの JSF ページクラス」ウィザードは、JSF ページを生成するだけでなく、「エンティティークラスの JPA コントローラクラス」ウィザードの機能を取り込んでいます。エンティティークラスの JPA コントローラクラスは作成したいが、JSF ページは生成したくない場合は、「エンティティーからの JSF ページクラス」ウィザードの代わりに「エンティティークラスの JPA コントローラクラス」ウィザードを使用できます。

目次

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

このチュートリアルに従うには、次のソフトウェアとリソースが必要です。

ソフトウェアまたはリソース 必須バージョン
NetBeans IDE 6.8 Java
Java Development Kit (JDK) version 6 または version 5
GlassFish アプリケーションサーバー V2
コンサルティングエージェンシーデータベース SQL をダウンロード

注: GlassFish アプリケーションサーバーは NetBeans ダウンロードに含まれています。

データベースの作成

このチュートリアルでは、consult という名前のコンサルティングエージェンシーデータベースを使用します。このデータベースは IDE のインストールに含まれないため、このチュートリアルを開始する前に、まずデータベースを作成する必要があります。

consult データベースは、さまざまなデータベース構造を処理する IDE サポートの幅広さを示すことを目的として設計されました。したがって、推奨されるデータベース設計の一例を示すものではありません。その代わりに、データベース設計に使用できる関連機能の多くを取り入れようとしています。たとえば、consult データベースには、すべての種類の関係、複合主キー、および多数の異なるデータ型が含まれています。データベース構造の詳しい概要については、表を参照してください。

注: このチュートリアルでは JavaDB データベースサーバーを使用しますが、MySQL データベースサーバーを使用してチュートリアルを完了することもできます。MySQL でデータベースを作成するには、mysql-consult.zip アーカイブをダウンロードして展開します。MySQL を操作する IDE の構成については、「MySQL データベースへの接続」チュートリアルを参照してください。

  1. derby-consult.zip をダウンロードし、アーカイブをローカルシステムに展開します。

    このアーカイブを展開すると、derby_create_consult.sqlderby_insert_data_consult.sql の 2 つの SQL スクリプトが表示されます。

  2. 「サービス」ウィンドウで「データベース」ノードを展開し、「JavaDB」ノードを右クリックして「サーバーを起動」を選択します。
  3. 「Java DB」ノードを右クリックし、「データベースを作成」を選択します。
  4. 「Java DB データベースを作成」ダイアログで、「データベース名」、「ユーザー名」、および「パスワード」に「consult」と入力します。「了解」をクリックします。
    「新規データベースを作成」ダイアログ

    「データベース」ノードの下に新しいノードが表示されます (jdbc:derby://localhost:1527/consult [CONSULT の consult])。

  5. 新しいノードを右クリックし、「接続」を選択します。
  6. メインメニューから「ファイル」>「ファイルを開く」を選択し、展開したファイル derby_create_consult.sql に移動します。「開く」をクリックします。

    ファイルが SQL エディタで自動的に開きます。

  7. SQL エディタツールバーの「接続」ドロップダウンリストで consult データベースが選択されていることを確認し、「SQL を実行」ボタンをクリックします。
SQL エディタのスクリーンショット

「SQL を実行」をクリックすると、「出力」ウィンドウに次の出力が表示されます。

「出力」ウィンドウのスクリーンショット

データベース構造の表示

表が正しく作成されたかどうかを確認するには、データベース接続ノードの下の「表」ノードを展開します。表のノードを展開すると、表の列、インデックス、および外部キーを確認できます。列を右クリックして「プロパティー」を選択すると、その列に関する追加情報が表示されます。

「サービス」ウィンドウのスクリーンショット

「表」ノードの下に表が表示されない場合は、「表」ノードを右クリックし、「再表示」を選択します。

consult データベースの構造を見ると、さまざまな関係とさまざまな型のフィールドを含む表があることがわかります。データベースからエンティティークラスを作成するときは、フィールドの型ごとに適したコードが自動的に生成されます。

consult データベースの図

次の表では、consult データベース内の表について説明します。

データベース表 説明 設計の特徴
CLIENT コンサルティングエージェンシーのクライアント生成されない複合主キー (フィールドは外部キーを構成しません)
CONSULTANT クライアントが契約に基づいて雇うことができる、コンサルティングエージェンシーの従業員 LONG VARCHAR 型の resume フィールドを含みます
CONSULTANT_STATUS コンサルティングエージェンシーでのコンサルタントのステータス (「Active」や「Inactive」などのステータスが考えられる) 生成されない CHAR 型の主キー
RECRUITER クライアントとコンサルタントのやり取りを担当する、コンサルティングエージェンシーの従業員  
PROJECT クライアントがコンサルティングエージェンシーのコンサルタントを要員として充てるプロジェクト CLIENT 表に対する外部キーを構成する 2 つのフィールドを含む、生成されない複合主キー
BILLABLE コンサルタントがプロジェクトの任務に費やし、コンサルティングエージェンシーが関連クライアントに対して請求する時間数 CLOB 型の artifact フィールドを含みます
ADDRESS クライアントの請求先住所  
PROJECT_CONSULTANT コンサルタントが現在割り当てられているプロジェクトを示す結合表 PROJECT と CONSULTANT とを相互参照します。PROJECT には複合主キーがあります

consult データベースには、さまざまな関係が含まれています。データベースからエンティティークラスを作成するときは、表間の関係を示す適切なコードが自動的に生成され、エンティティークラスのフィールドに適切な注釈が追加されます。次の表では、consult データベース内の表間の関係について説明します。逆方向の関係は示していません。

データベース表 関係する表 関係の情報 説明
CLIENT RECRUITER 手動編集ありで null 可能な 1 対 1 の関係、編集なしで null 可能な 1 対多の関係 CLIENT には多数の RECRUITER があり、RECRUITER には 0 または 1 つの CLIENT があります
CLIENT ADDRESS null 可能ではない 1 対 1 の関係 CLIENT には 1 つの ADDRESS があり、ADDRESS には 0 または 1 つの CLIENT があります
CLIENT PROJECT null 可能ではない 1 対多の関係。Project エンティティーで、client フィールドの値は Project の主キーの一部です CLIENT には多数の PROJECT があり (多数の PROJECT に割り当てることができ)、PROJECT には 1 つの CLIENT があります
CONSULTANT BILLABLE null 可能ではない 1 対多の関係 CONSULTANT には多数の BILLABLE があり、BILLABLE には 1 つの CONSULTANT があります
CONSULTANT CONSULTANT_STATUS null 可能ではない 1 対多の関係 CONSULTANT には 1 つの CONSULTANT_STATUS があり、CONSULTANT_STATUS には多数の CONSULTANT があります (多数の CONSULTANT に割り当てることができます)
CONSULTANT RECRUITER null 可能な 1 対多の関係 CONSULTANT には 0 または 1 つの RECRUITER があり、RECRUITER には多数の CONSULTANT があります
BILLABLE PROJECT null 可能ではない 1 対多の関係 BILLABLE には 1 つの PROJECT があり、PROJECT には多数の BILLABLE があります
PROJECT_CONSULTANT CONSULTANT null 可能ではない 1 対多の関係 PROJECT_CONSULTANT には 1 つの CONSULTANT があり、COSULTANT には多数の PROJECT_CONSULTANT があります (多数の PROJECT_CONSULTANT に割り当てることができます)
PROJECT_CONSULTANT PROJECT 1 対多の関係 PROJECT_CONSULTANT には 1 つの PROJECT があり、PROJECT には多数の PROJECT_CONSULTANT があります

データベースが作成されたので、次に Web アプリケーションを作成し、「データベースからのエンティティークラス」ウィザードを使用して、データベースの表に基づいてエンティティークラスを生成できます。

Web アプリケーションプロジェクトの作成

この課題では、Web プロジェクトを作成し、JavaServer Faces フレームワークをプロジェクトに追加します。プロジェクトを作成するときは、「新規プロジェクト」ウィザードの「フレームワーク」パネルで「JavaServer Faces」を選択します。

  1. 「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択します。
  2. 「Java Web」カテゴリから「Web アプリケーション」を選択します。「次へ」をクリックします。
  3. プロジェクト名として「ConsultingAgency」と入力し、プロジェクトの場所を設定します。
  4. 専用フォルダを使用するオプションが選択されている場合は選択を解除します。
    このチュートリアルでは、ライブラリをほかのユーザーと共有する必要がないので、プロジェクトライブラリを専用のフォルダにコピーする理由はほとんどありません。
    「次へ」をクリックします。
  5. サーバーを GlassFish に設定し、Java EE バージョンを Java EE 5 に設定します。「次へ」をクリックします。
  6. 「フレームワーク」パネルで「JavaServer Faces」チェックボックスを選択します。「完了」をクリックします。

    注: フレームワークを選択するときは、Visual Web JavaServer Faces ではなく、必ず JavaServer Faces フレームワークを選択してください。

「完了」をクリックすると、Web アプリケーションプロジェクトが作成され、welcomeJSF.jsp がエディタに表示されます。welcomeJSF.jsp は編集する必要がないので、閉じてもかまいません。

データベースからのエンティティークラスの生成

データベースを作成し、データベース接続を IDE に登録したら、「データベースからのエンティティークラス」ウィザードを使用して、データベース内の表に基づくエンティティークラスを簡単に生成できます。IDE では、選択した各表のエンティティークラスを生成でき、関連する表に必要なエンティティークラスを生成することもできます。

  1. 「プロジェクト」ウィンドウで「ConsultingAgency」ノードを右クリックし、「新規」>「データベースからのエンティティークラス」を選択します。
  2. 「データソース」ドロップダウンリストから「新しいデータソース」を選択して「データソースを作成」ダイアログを開きます。
  3. 「JNDI 名」に「jdbc/consult」と入力し、「データベース接続」で「jdbc:derby://localhost:1527/consult [CONSULT の consult]」を選択します。「了解」をクリックしてダイアログを閉じ、ウィザードに戻ります。
    「データソースを作成」ダイアログ

    consult データベース内の表が「使用可能な表」リストボックスに表示されます。

  4. ウィザードで「すべてを追加」をクリックします。「次へ」をクリックします。
    「新規 データベースからのエンティティークラス」ウィザード
  5. 「パッケージ」に「jpa.entities」と入力します。名前付きクエリーを生成するためのチェックボックスが選択されていることを確認します。
  6. 「持続性ユニットを作成」をクリックして「持続性ユニットを作成」ダイアログを開きます。ダイアログ内の「作成」をクリックして持続性ユニットを作成し、ウィザードに戻ります。

    持続性ユニットのデフォルト値をそのまま使用します。

    「持続性ユニットを作成」ウィザード
  7. 「次へ」をクリックします。
  8. ウィザードの「マッピングオプション」ページのデフォルト値をそのまま使用します。「完了」をクリックします。

    生成されたエンティティー内の注釈やコレクション型をさらにカスタマイズする場合は、ウィザードの「マッピングオプション」ページを使用できます。このチュートリアルでは、デフォルト値で十分です。

ウィザードを使用してデータベースからエンティティークラスを作成するとき、IDE で表間の関係が確認されます。「プロジェクト」ウィンドウで「ソースパッケージ」ノードの「jpa.entities」を展開すると、PROJECT_CONSULTANT 表を除くすべての表のエンティティークラスが生成されていることがわかります。PROJECT_CONSULTANT のエンティティークラスが作成されなかった理由は、この表が結合表であるためです。

また、複合主キーを持つ CLIENT と PROJECT の各表に 2 つの追加クラスが生成されています。これらの表の主キークラス (ClientPK.javaProjectPK.java) の名前には、PK が付加されています。

「プロジェクト」ウィンドウのスクリーンショット

エンティティークラスに生成されたコードを見ると、エンティティークラスの ID フィールドに @GeneratedValue 注釈が、一部のフィールドに @Basic(optional = "false") 注釈要素がウィザードによって追加されていることがわかります。「エンティティーからの JSF ページクラス」ウィザードでは、@Basic(optional = "false") 注釈要素に基づき、これらのフィールドで null 可能ではない列の違反を防止するためのチェック機能を含むコードを生成できます。

エンティティークラスの編集

生成されたエンティティークラスは、必要に応じて編集できます。この課題では、エンティティークラスの toString メソッドの実装を変更します。Client クラスと Recruiter クラスでは、注釈を変更して、クライアントとリクルータとの関係を 1 対多から 1 対 1 に変更します。リクルータとコンサルタントとの間には null 可能な 1 対多の関係がすでに存在するので、このチュートリアルではデモの目的でクライアントとリクルータとの間に null 可能な 1 対 1 の関係を確立します。

注: チュートリアルのこの節は省略可能です。「エンティティーからの JSF ページクラス」ウィザードを使用して JSF ページを生成する前にエンティティークラスを変更する必要はありません。

Address.java の編集

Address エンティティークラスを開き、次の変更を行います。

  1. 完全な住所を返すように toString メソッドの return 文を変更します。
    return line1 + ", " + line2 + ", " + city + ", " + region + ", " + country + ", " + postalCode;

    IDE のコード補完機能を使用すると、フィールドを追加するのに役立ちます。

    フィールドのコード補完機能のスクリーンショット
  2. 必要に応じてインポートを修正し、変更内容を保存します。

Billable.java の編集

Billable エンティティークラスを開き、次の変更を行います。

  1. 説明、コンサルタント ID、およびプロジェクトを返すように toString メソッドの return 文を変更します。
    public String toString() {
            return description + ", " + consultantId + ", " + project;
  2. 必要に応じてインポートを修正し、変更内容を保存します。

Client.java の編集

  1. recruiterCollection フィールドの @OneToMany 注釈を変更して関係を 1 対 1 にし、フィールドをコレクションから Recruiter recruiter に変更します。
    @OneToOne(mappedBy = "client")
    private Recruiter recruiter;
  2. フィールドの名前の変更に基づいて、Collection<Recruiter> recruiterCollection の取得メソッドと設定メソッドを変更します。新しい取得メソッドと設定メソッドは次のようになります。
    public Recruiter getRecruiter() {
        return recruiter;
    }
    
    public void setRecruiter(Recruiter recruiter) {
        this.recruiter = recruiter;
    }

    Collection<Recruiter> recruiterCollection の取得メソッドと設定メソッドを削除してから、「コードを挿入」ダイアログを使用して Recruiter recruiter の新しい取得メソッドと設定メソッドを生成したほうが簡単かもしれません。新しい取得メソッドと設定メソッドを作成するには、ソースコード内を右クリックして「コードを挿入」(Alt-Insert) を選択し、「取得メソッドおよび設定メソッド」を選択します。「取得メソッドと設定メソッドの生成」ダイアログで「recruiter」を選択し、「生成」をクリックします。

    「取得メソッドおよび設定メソッドの生成」ダイアログ
  3. String.valueOf(clientPK) を返すように toString メソッドの return 文を変更します。
    public String toString() {
        return String.valueOf(clientPK);
    }
  4. 必要に応じてインポートを修正し、変更内容を保存します。

ClientPK.java の編集

  1. クライアント名と部門番号を返すように toString メソッドの return 文を変更します。
    public String toString() {
        return clientName + ", " + "Dept. " + clientDepartmentNumber;
    }
  2. 必要に応じてインポートを修正し、変更内容を保存します。

Consultant.java の編集

  1. 電子メールを返すように toString メソッドの return 文を変更します。
    public String toString() {
        return email;
    }
  2. 必要に応じてインポートを修正し、変更内容を保存します。

ConsultantStatus.java の編集

  1. ステータス ID と説明を返すように toString メソッドの return 文を変更します。
    public String toString() {
        return statusId + ", " + description;
    }
  2. 必要に応じてインポートを修正し、変更内容を保存します。

Project.java の編集

  1. 次に示す内容を返すように toString メソッドの return 文を変更します。
    public String toString() {
        return (projectPK == null ? "(unnamed project)" : projectPK.getProjectName()) + ", " + client;
    }
  2. 必要に応じてインポートを修正し、変更内容を保存します。

Recruiter.java の編集

  1. client フィールドの @ManyToOne 注釈を変更して関係を 1 対 1 にマークします。
    @OneToOne
    private Client client;
  2. 電子メールを返すように toString メソッドの return 文を変更します。
    public String toString() {
        return email;
    }
  3. 必要に応じてインポートを修正し、変更内容を保存します。

エンティティークラスからの JSF ページの生成

エンティティークラスが作成されたので、次にデータを表示および変更するための Web インタフェースを作成できます。ここでは、「エンティティーからの JSF ページクラス」ウィザードを使用して、JavaServer Faces ページを生成します。ウィザードで生成されるコードには、エンティティークラス内の注釈に基づくチェック機能が含まれます。また、Dynamic Faces テクノロジを使用して JavaServer Faces テクノロジを拡張することで、アプリケーション内で Ajax 機能を有効にすることもできます。

ウィザードでは、エンティティークラスごとに次のものが生成されます。

  • JPA コントローラクラス
  • JSF コントローラクラス
  • JSF コンバータクラス
  • 4 つの JSP ファイル (Detail.jspEdit.jspList.jspNew.jsp) を含むディレクトリ
  • faces-config.xml 内にクラスの管理対象 Bean 要素、コンバータ要素、およびナビゲーション規則

このウィザードでは、コントローラクラスによって使用される次のクラスも生成されます。

  • JPA コントローラによって使用される例外クラス
  • JSF コントローラによって使用されるユーティリティークラス

JSF ページを生成するには、次の手順に従います。

  1. 「プロジェクト」ウィンドウでプロジェクトノードを右クリックし、「新規」>「エンティティーからの JSF ページクラス」を選択して、「新規 エンティティーからの JSF ページクラス」ウィザードを開きます。

    ウィザードの「使用可能な表」区画に、プロジェクトの 7 つのエンティティークラスが一覧表示されます。ウィザードでは、組み込み可能なクラス (ClientPK.javaProjectPK.java) は一覧表示されません。

  2. 「すべてを追加」をクリックして、すべてのクラスを「選択されているエンティティークラス」区画に移動します。「次へ」をクリックします。
    「新規 エンティティーからの JSF ページクラス」ウィザード
  3. 「JPA コントローラパッケージ」に「jpa.controllers」と入力します。
  4. 「JSF クラスパッケージ」に「jsf」と入力します。
  5. Ajax が有効な生成済みページ」を選択します。
  6. 「完了」をクリックします。

「完了」をクリックすると、jpa.controllers パッケージにエンティティークラスの JPA コントローラクラスが作成され、jsf パッケージに JSF コンバータクラスと JSF コントローラクラスが作成されます。各 JPA コントローラクラスは、対応するエンティティークラスの操作を処理します。これには、Java Persistence API を使用したエンティティークラスのインスタンスの作成、編集、および破棄が含まれます。各 JSF コンバータクラスは、JavaServer Faces で定義されている javax.faces.convert.Converter インタフェースを実装し、対応するエンティティークラスのインスタンスと文字列型のオブジェクトの間の変換を行います。各 JSF コントローラクラスは、それぞれに対応する、生成される JSP に固有であり、JPA コントローラクラスのメソッドを呼び出し、キャッチする例外を具体的に示すコードを含んでいます。

一般に、アプリケーションを変更するときは、JSF コントローラクラスのコントローラロジックを変更し、生成されるコードを例として使用します。

「Web ページ」ノードを展開すると、エンティティークラスごとにフォルダが生成されたことがわかります。各フォルダには、Detail.jspEdit.jspList.jsp、および New.jsp の各ファイルが含まれます。welcomeJSF.jsp も変更され、各List.jsp ページへのリンクが挿入されています。

「プロジェクト」ウィンドウの「Web ページ」ディレクトリのスクリーンショット

「ソースパッケージ」ノードを展開すると、ウィザードによって生成されたコントローラ、コンバータ、例外、およびユーティリティーの各クラスを確認できます。

「プロジェクト」ウィンドウの「ソースパッケージ」ディレクトリのスクリーンショット

「構成ファイル」ノードを展開し、faces-config.xml を XML エディタで開くと、コントローラおよびコンバータクラスごとに管理対象 Bean とコンバータ要素が挿入されたことがわかります。また、アプリケーションを JSP にナビゲートさせる論理的な結果を示すナビゲーション規則要素も JSP ごとに挿入されています。

アプリケーションでの Ajax の有効化について

「エンティティーからの JSF ページクラス」ウィザードの最後の区画では、「Ajax が有効な生成済みページ」を選択することで、JSF フレームワークの Dynamic Faces 拡張機能を通じてアプリケーションで Ajax 機能を有効にできます。ウィザードによって、必要な JSF 拡張ライブラリがプロジェクトに追加され、Ajax ライフサイクルが有効になるようにアプリケーションの配備記述子が構成されます。JSF の Dynamic Faces 拡張機能については、JavaServer Faces テクノロジの拡張機能のサイトを参照してください。

「新規 エンティティーからの JSF ページクラス」ウィザード

このオプションを選択すると、ウィザードは次の処理を実行します。

  • プロジェクトで Dynamic Faces テクノロジを使用するために必要な JSF 拡張ライブラリがプロジェクトに追加されます (jsf-extensions-commonjsf-extensions-dynamic-facescommons-logging、および shale-remoting)。
    「プロジェクト」ウィンドウの「ライブラリ」ノードのスクリーンショット
  • javax.faces.LIFECYCLE_ID 初期化パラメータのエントリが追加され、その値が com.sun.faces.lifecycle.PARTIAL に設定されることで、web.xml は変更され、Ajax ライフサイクルを使用するように FacesServlet が構成されます。
    web.xml エディタのスクリーンショット
  • WEB-INF/jspf」ディレクトリ内に JSP フラグメントファイル AjaxScripts.jspf が生成されます。AjaxScripts.jspf は、Dynamic Faces ライブラリに含まれる JavaScript ファイルを描画します。

アプリケーションは、「Web ページ」ディレクトリに JavaScript ファイル jsfcrud.js を含みます。jsfcrud.js ファイルは、Dynamic Faces の JavaScript ファイルが描画されたかどうかを確認して、Dynamic Faces が有効になっているかどうかを確認します。Dynamic Faces が有効になっている場合は、Ajax 要求を送信するようにフォームが構成されます。

Dynamic Faces 拡張機能を使ってアプリケーションで Ajax を有効にしたら、アプリケーションを変更して、Dynamic Faces 拡張機能をさらに追加できます。

エンティティークラスの JPA コントローラクラスの生成

生成された Web アプリケーションでは、JPA コントローラのメソッドは JSF コントローラクラスのメソッドによってアクセスされます。「エンティティーからの JSF ページクラス」ウィザードを使用するとき、選択した各エンティティーの JPA コントローラクラスが自動的に生成されます。ただし、JPA コントローラクラスの使用は JSF Web アプリケーションに限定されません。JPA コントローラクラスは、Java Persistence API を使ってエンティティークラスを操作し、エンティティーの持続性を管理するほかのアプリケーション (デスクトップアプリケーションなど) でも使用できます。

「エンティティークラスの JPA コントローラクラス」ウィザードを使用すれば、プロジェクトで JPA コントローラクラスを簡単に作成できます。JPA コントローラクラスを作成するには、「新規ファイル」ウィザードを開き、「持続性」カテゴリから「エンティティークラスの JPA コントローラクラス」を選択します。ウィザードで、JPA コントローラクラスを作成するエンティティークラスを指定し、次にファイルの作成場所を指定します。このウィザードでは、JPA コントローラクラスによって使用される例外クラスも自動的に作成されます。

JPA コントローラクラスウィザードのスクリーンショット

JPA コントローラが生成されたら、ほかのファイルからそのコントローラのメソッドにアクセスできるようになります。データベーススキーマを更新する場合は、「データベースからのエンティティークラス」ウィザードと「エンティティークラスの JPA コントローラクラス」ウィザードをもう一度実行して、クラスを更新できます。必要な場合は、JPA コントローラクラスを作成したあとに「エンティティーからの JSF ページクラス」ウィザードを実行し、既存の JPA コントローラクラスのパッケージを指定できます。この場合、既存の JPA コントローラクラスは、再生成されるのではなく利用されます。

データベースへのデータの追加

アプリケーションの作成が終わったので、アプリケーションを配備して実行できます。作成したコンサルティングエージェンシーデータベースには、データが入力されていません。Web インタフェースを使用するか、SQL スクリプトを実行して、データベースにデータを追加する必要があります。データを追加すると、表間の関係がどのように機能するのかがわかるようになります。

SQL スクリプトによるデータの追加

Web フォームを使用してデータを追加しない場合は、derby-consult.zip に含まれている derby_insert_data_consult.sql スクリプトを実行できます。

  1. derby_insert_data_consult.sql を開くには、メインメニューから「ファイル」>「ファイルを開く」を選択します。

    ファイルが SQL エディタで自動的に開きます。

  2. SQL エディタツールバーの「接続」ドロップダウンリストで consult データベースが選択されていることを確認し、ツールバーの「SQL を実行」ボタンをクリックします。
    SQL エディタとデータ挿入スクリプトのスクリーンショット

    スクリプトの実行結果は「出力」ウィンドウで確認できます。

注: MySQL データベースサーバーを使用している場合は、mysql-consult.zip に含まれている mysql_insert_data_consult.sql ファイルを開いてください。

Web インタフェースによるデータの追加

データベースにデータを追加するには、ブラウザでアプリケーションを起動して Web フォームを使用する方法もあります。

  1. メインツールバーで「主プロジェクトを実行」をクリックします。

    変更したファイルがすべて保存され、アプリケーションが再構築され、サーバーに配備されます。デフォルトの Web ブラウザでローカルアドレス http://localhost:8080/ConsultingAgency/ が開きます。

    welcomeJSF ページが表示されたブラウザウィンドウのスクリーンショット
  2. 「Show All Address Item」をクリックし、「New Address」をクリックします。
  3. 「New Address」フォームで次のデータを追加します。
    フィールド
    Line1 100 Data Street
    Line2 Suite 432
    City San Francisco
    Region California
    Country USA
    PostalCode 94103
    「Create」をクリックします。
  4. 「Index」をクリックして index ページに戻ります。
  5. 「Show All Client Items」をクリックし、「New Client」をクリックします。
  6. 「New Client」フォームで次のデータを追加します。
    フィールド
    ClientDepartmentNumber 2000
    Client Name Big Data Corp.
    Contact Email
    Contact Password accounting
  7. 「BillingAddress」ドロップダウンリストで「Palm Spring Street」を選択します。
  8. 「Create」をクリックし、次に「Index」をクリックして、index ページに戻ります。
  9. 「Show All Project Items」をクリックし、「New Project」をクリックします。
  10. 「New Project」フォームで次のデータを追加します。
    フィールド
    ProjectName Secret Project
    ContactEmail
    ContactPassword project.manager
    「Create」をクリックし、次に「Index」をクリックして、index ページに戻ります。
  11. 「Show All Consultant Status Item」をクリックし、次に「New Consultant Status」をクリックします。
  12. 「New ConsultantStatus」フォームで次のデータを追加します。
    フィールド
    StatusId A
    Description Active
    「Create」をクリックし、次に「Index」をクリックして、index ページに戻ります。
  13. 「Show All Consultant Item」をクリックし、「New Consultant」をクリックします。
  14. 「New Consultant」フォームで次のデータを追加します。
    フィールド
    Email
    Password janet.smart
    HourlyRate 80
    BillableHourlyRate 120
  15. 「ProjectCollection」フィールドで「Secret Project」を選択します。
  16. 「StatusId」ドロップダウンリストで「A, Active」を選択します。
  17. 「Create」をクリックし、次に「Index」をクリックして、index ページに戻ります。
  18. 「Show All Billable Items」をクリックし、「New Billable」をクリックします。
  19. 「New Billable」フォームで次のデータを追加します。
    フィールド
    StartDate 2008-10-13 00:00:00.0
    EndDate 2008-10-17 00:00:00.0
    Hours 40
    HourlyRate 80
    BillableHourlyRate 120
    Description begin gathering requirements
    ConsultantId
    Project Secret Project
    「Create」をクリックし、「New Billable」をクリックします。
  20. 「New Billable」フォームで次のデータを追加します。

    今度は、「Description」フィールドに「finish gathering requirements」と入力します。

    フィールド
    StartDate 2008-10-20 00:00:00.0
    EndDate 2008-10-24 00:00:00.0
    Hours 40
    HourlyRate 80
    BillableHourlyRate 120
    Description finish gathering requirements
    ConsultantId
    Project Secret Project
    「Create」をクリックして index ページに戻ります。
  21. 「Show All Recruiter Item」をクリックし、「New Recruiter」をクリックします。
  22. 「New Recruiter」フォームで次のデータを追加します。
    フィールド
    Email
    Password bob
  23. 「ConsultantCollection」リストで「」を選択します。

    注: 「Client」ドロップダウンリストは空のままにします。

  24. 「Create」をクリックし、次に「Index」をクリックして、index ページに戻ります。

データベースにデータを追加したら、生成された各ページに移動して、表間の関係を確認できます。

生成されたコードでの機能の確認

データベースにデータを入力したら、ウィザードで生成されたコードが、データベースフィールドのプロパティーにどのように基づいているのかの例を確認できます。

読み取り専用の主キーフィールド

データベース内のあるフィールドが主キーである場合は、生成されたフォーム内でユーザーがそのフィールドを編集できないようにするためのコードがウィザードによって生成されます。主キーフィールドが読み取り専用となっている場合の例を次に示します。

  • 「New Client」ページに移動すると、「ProjectCollection」フィールドが読み取り専用であることがわかります。既存のプロジェクトに関連付けられているクライアントの変更をアプリケーションで許可したとしても、プロジェクトに関連付けられているクライアントがプロジェクトの主キーの一部であるため、操作は失敗します。これを SQL スクリプトで確認するには、consult_project_pk 主キーと consult_project_fk_client_name 外部キーを調べます。
  • 「Editing Project」ページに移動すると、「Client」フィールドが読み取り専用であることがわかります。このフィールドも、プロジェクトに関連付けられているクライアントがプロジェクトの主キーの一部であるので、読み取り専用になっています。

生成されるエラーチェック機能

生成されたコードでは、ユーザーのアクションがエラーになるかどうかを確認できます。たとえば、null 可能ではない列が表にある場合は、アクションによってそのフィールドが null になるかどうかを確認し、null になる場合はエラーメッセージを表示できます。データベースにデータを入力したあと、フォームでデータを編集してみることで、生成されたチェック機能の例を確認できます。次のアクションを行うとエラーメッセージを受け取ります。

  • 別の Project 項目を作成して、「ProjectName」にもう一度「Secret Project」を指定し、「ContactEmail」フィールドと「Client」フィールドに値を入力します。

    項目がすでに存在することを示すエラーメッセージが表示されます。

  • 別の Address 項目を作成し、すべてのフィールドを空のままにします。

    必須フィールドを示すエラーメッセージが表示されます。

  • 「BillableCollection」リストで「finish gathering requirements」を選択解除して、Consultant 項目「」を編集します。

    consultantId」フィールドは null にできないため、選択解除した Billable 項目は保持する必要があることを示すエラーメッセージが表示されます。

  • Project 項目「Secret Project, Big Data Corp., Dept. 2000」を破棄します。

    関連付けられている Billable 項目の「project」フィールドは null にできないため、この Project 項目は破棄できないことを示すエラーメッセージが表示されます。

  • 別のユーザーによってすでに破棄されている項目を破棄します。

    この項目が存在しないことを示すエラーメッセージが表示され、項目がリストに表示されなくなります。

    これは、2 つのブラウザを使用して、各ブラウザから同じページ (「Listing Billable Items 」ページなど) に移動した場合に実行できます。一方のブラウザで Billable 項目を 1 つ破棄してから、もう一方のブラウザで同じ項目を破棄してみます。


関連項目

NetBeans IDE を使って、Java Persistence と JavaServer Faces を使用する Web アプリケーションを開発する方法については、次のリソースを参照してください。