この章では、Java Persistence API(JPA)およびOracle Application Developer Framework(Oracle ADF)を使用したマスター・ディテール・アプリケーションの作成方法について説明します。内容は次のとおりです。
注意: この章で説明するようにマスター・ディテール・アプリケーションを開発するには、Oracle JDeveloper 11g 以降のStudio Editionのインストールが必要です。 |
マスター・ディテール・アプリケーションを使用すると、関連する表のデータを同時に表示できます。マスター表のレコードをディテール表の関連するレコードとともに表示できます。マスター・ディテール・データを編集するためのプロビジョニングがアプリケーションに組み込まれている場合は、共通のインタフェースを使用して両方の表のデータを編集することもできます。この章で作成するマスター・ディテール・アプリケーションは、次のもので構成されます。
ADFバインディング層を介して公開されるJPA/EJB中間層コンポーネント(HR
スキーマの表内のデータへのアクセスと更新を可能にします)。これは、model
という名前の1つのプロジェクトにあります。
ユーザー・インタフェース(UI)、つまりビュー(アプリケーションのUIとして機能するJavaServer Faces(JSF)ページのセットで構成されています)。これは、view
という名前のプロジェクトにあります。
model
およびview
プロジェクトは、Java EE Model-View-Controller(MVC)デザイン・パターンに基づいています。このデザイン・パターンは、Oracle ADFを使用して簡単に実装できます。
図7-1に、このアプリケーションに対して開発される項目間の関係を示します。
このアプリケーションは、Oracle DatabaseのHR
スキーマにアクセスします。マスター表として部門表を使用して、従業員表からディテール・データを表示します。この章では、Oracle ADFとJDeveloperを使用してこのアプリケーションを作成する方法について説明します。
Oracle ADFは、Java EE標準およびオープンソース・テクノロジに基づくエンドツーエンド・アプリケーション・フレームワークであり、サービス指向アプリケーションの作成を簡略化および促進します。Oracle ADFを使用すると、Web、ワイヤレス、デスクトップまたはWebサービス・インタフェースを使用してデータを検索、表示、作成、変更および検証するエンタープライズ・ソリューションを開発できます。Oracle JDeveloper 11gとOracle ADFを連携して使用することで、ドラッグ・アンド・ドロップによるデータ・バインディング、ビジュアルなUI設計およびチーム開発機能が組み込まれた、設計からデプロイまでの全開発のライフサイクルを網羅する環境が提供されます。
次の項では、マスター・ディテール・アプリケーションの作成に使用する、Java Persistence API(JPA)といくつかのOracle ADF機能について説明します。
関連項目:
|
JPAは、オブジェクト/リレーショナル・マッピングおよびJavaとデータベース間のデータ永続性を処理するJava EE仕様の一部です。
Java Persistenceは次のものから構成されています。
Java Persistence API(JPA)
問合せ言語
オブジェクトまたはリレーショナル・マッピング・メタデータ
Oracle ADF Facesは、JavaServer Faces(JSF)JSR 127仕様に基づいています。Oracle ADF Facesコンポーネントは、アプリケーションのユーザー・インタフェースで使用されます。これらのコンポーネントは、JSFをサポートする任意のIDEで使用できます。
Oracle ADF Facesを使用すると、アプリケーションの一貫したルック・アンド・フィールを設定できます。これにより、ルック・アンド・フィールに準拠することより、ユーザー・インタフェースの相互作用に重点を置くことができます。ADF Facesコンポーネントは、多言語および翻訳の実装やアクセシビリティ機能もサポートしています。
JDeveloperには、複数の設計ツール、ウィザード、特殊なダイアログ・ボックスおよびプロパティ・エディタがあり、これらはADF Facesコンポーネントをページに挿入して使用するのに役立ちます。たとえば、ビジュアル・エディタでは、コンポーネント・パレットからコンポーネントをドラッグ・アンド・ドロップしてユーザー・インタフェースを設計できます。XMLまたはJSP/HTMLのコーディングに慣れている場合は、ページ・ファイルのソースを編集して、ADF Facesコンポーネントのタグを挿入することもできます。
次の手順で、JDeveloperでアプリケーションを作成し、アプリケーション用のデータ・モデルを作成します。
マスター・ディテール・アプリケーションの開発に進む前に、アプリケーションとデータベースの間の接続を確立するConnection
オブジェクトHRConn
を作成する必要があります。Connection
オブジェクトの作成手順については、第3章を参照してください。
「ファイル」メニューから「新規」を選択して新規ギャラリを表示します。「一般」カテゴリから「アプリケーション」を選択し、次に「汎用アプリケーション」を選択します。「汎用アプリケーションの作成」ウィザードが表示されます。
アプリケーションの名前としてHR_EJB_JPA_App
を入力し、アプリケーション・パッケージの接頭辞としてoracle
を入力し、「次へ」をクリックします。
汎用プロジェクトの名前付け画面で、プロジェクト名としてEJBModel
を入力し、「終了」をクリックします。
「ナビゲータ」ペインで、「データベース・ナビゲータ」タブをクリックします。「IDE接続」リストからHRConn接続を選択し、HR_EJB_JPA_App
ノード内にドラッグ・アンド・ドロップし、アプリケーションで接続が使用できるようにします。
EJBModel
というプロジェクトを含むHR_EJB_JPA_App
という名前のアプリケーションができました。
モデル・プロジェクトで、EJB 3.0エンティティBeanを使用して、hr.Departments
およびhr.Employees
表に対する永続性モデルを作成します。
「ファイル」メニューから「新規」を選択して新規ギャラリを表示します。「ビジネス層」カテゴリを開き、「EJB」を選択します。「項目」リストで、「表からのエンティティ」を選択します。「OK」をクリックします。
「EJBのバージョンの選択」で、EJBのバージョンとしてEJB 3.0 -- JPA Entitiesを選択し、「次へ」を選択します。「次へ」 をクリックして「永続性ユニット」ページをスキップします。
「接続のタイプ」ページで、「オンライン・データベース接続」オプションを選択し、デフォルトのオフライン・データベース名をそのまま使用して、「次へ」をクリックします。
「データベース接続の詳細」ページで、使用する接続としてHRConnを選択します。「次へ」をクリックします。
「問合せ」をクリックし、HRスキーマで使用可能なオブジェクトを取得します。DEPARTMENTSとEMPLOYEESを「選択済」リストに移動します。「次へ」をクリックします。
この手順では、パッケージ名がoracle
であることを確認します。「次へ」、「終了」、の順にクリックします。
アプリケーション・ナビゲータでEJBModelノードを右クリックし、「New」を選択します。
「新規ギャラリ」で「ビジネス層」を、カテゴリとして「EJB」を選択し、「EJBダイアグラム(JPA/EJB 3.0)」をダブルクリックします。
「EJBダイアグラムの作成」ダイアログ・ボックスで、ダイアグラムのデフォルト名(EJBダイアグラム1)をEJB 3に変更し、パッケージ名がoracle
あることを確認します。「OK」をクリックします。
「ダイアグラムの永続性ユニットへの関連付け」ダイアログ・ボックスで、「OK」をクリックし、提案された永続性ユニットEJBModel(EJBModel.jpr
)を受け入れます。ダイアグラム・エディタで、新しい空のダイアグラムが開きます。
アプリケーション・ナビゲータからDepartmentsエンティティとEmployeesエンティティを選択し、ダイアグラムにドラッグ・アンド・ドロップします。2つのエンティティが水平に配置されていることを、ダイアグラムのレイアウトで再確認します。作業内容をすべて保存します。
この項では、従業員レコードと部門レコードを検索するメソッドを実装するセッションBeanを作成します。
「コンポーネント・パレット」ライブラリから「EJBコンポーネント」を選択し、EJB Nodesを開きます。「セッションBean」コンポーネントを選択し、ダイアグラムにドラッグ・アンド・ドロップします。「セッションBean作成」ウィザードが開きます。
「EJBの名前とオプション」手順で、「EJB名」をHRFacadeに設定し、次の値が適切に設定されていることを確認します。
セッション・タイプ: ステートレス
トランザクション・タイプ: コンテナ
セッション・ファサード・メソッドの生成: チェック
エンティティの実装: JPAエンティティ
永続性ユニット: EJBMode
「次へ」をクリックします。
EmployeesおよびDepartmentsノードを開き、2つのエンティティのfindAllByRangeメソッドのチェックを外します。「次へ」をクリックします。
「クラス定義」手順で、「Beanクラス」の名前がoracle.HRFacadeBean
であることを確認します。「次へ」をクリックします。
次の手順で、リモート・インタフェースとローカル・インタフェースの両方の実装を選択します。リモート・インタフェースは、Javaクライアントなど、個別の仮想マシンで実行されるクライアント・アプリケーションに使用され、ローカル・インタフェースは、Webクライアントなどの同一の仮想マシン上で動作するクライアント・アプリケーションに使用されます。「次へ」をクリックして、作成したクラスの概要を確認し、「終了」をクリックします。
セッションBeanは次の3つのファイルから構成されています。HRFacadeBeanにはセッションBeanコードが格納されています。HRFacadeにはリモート・クライアント用のBeanの機能が記述され、HRFacadeLocalにはローカル・クライアントの機能が記述されます。
ダイアグラムのEmployeesエンティティBeanをダブルクリックして、クラスのソース・コードを開きます。
最後の@NamedQuery
文の終わりにカンマを追加し、次の文を追加します。
@NamedQuery(name = "Employees.findByName", query = "select o from Employees o where o.firstName like :p_name")
コードは次のように表示されます。
@Entity @NamedQueries({ @NamedQuery(name = "Employees.findAll", query = "select o from Employees o"), @NamedQuery(name = "Employees.findByName", query = "select o from Employees o where o.firstName like :p_name") })
注意: これらのオブジェクトと他のJavaファイルとの違いは、これらのオブジェクトをEJBエンティティとして識別する注釈です。EJB3.0とJPAの主な機能として、以前のバージョンのようなデプロイメント記述子のかわりに、メタデータ注釈を使用することで、オブジェクト・リレーショナル・マッピングを含むエンティティが作成できます。 |
「メイク」アイコンをクリックして、 Employees.java
クラスをコンパイルします。「メッセージ - ログ」ウィンドウにエラーが表示されないことを確認します 。
アプリケーション・ナビゲータでHRFacadeBeanノードを右クリックし、コンテキスト・メニューから「セッション・ファサードの編集」を選択します。
ダイアログのEmployeesノードを開きます。公開可能メソッドとして、新しく名前を付けた問合せEmployees.findByName
が表示されます。この問合せを選択し、「OK」をクリックします。新しいメソッドがセッションBeanに追加されます。
永続性ユニットは、コンテナの外でも中でも動作するように構成できます。この項では、従業員レコードと部門レコードを検索するメソッドを実装するセッションBeanを作成します。
META-INFを開き、次にpersistence.xmlを右クリックします。コンテキスト・メニューから「新規のJavaサービス・ファサード」を選択します。
「Javaサービス・クラス」パネルで、新規永続性モデルを作成するか、既存ユニットを使用するかを選択できます。「永続性ユニットを選択するか、次のパネルで作成します」を選択し、「mainメソッドの生成」チェックボックスにチェックを付けます。「次へ」をクリックします。
永続性ユニットoutside
に名前を付けます。「JDBC接続」を選択し、JDBC接続がHRConn
に設定されていることを確認します。「次へ」をクリックします。
デフォルトですべてのメソッドが選択されています。byRange
メソッドのチェックを外します。「次へ」、「終了」、の順にクリックします。
「ソース・エディタ」ウィンドウでJavaServiceFacadeクラスに対して、// TODO comment
の後ろに新しい行を追加します。
Employees a = javaServiceFacade.queryEmployeesFindByName("P%").get(0);
クラスをコンパイルし、作業を保存します。
アプリケーション・ナビゲータで JavaServiceFacadeノードを右クリックし、コンテキストから「実行」を選択します。
Java EEコンテナの外で実行されているクラスの結果が「ログ」ウィンドウに表示され、取得したレコードの最初のlastName
を戻します。
META-INFを開き、persistence.xmlをダブルクリックしてファイルの内容を表示します。
2つの永続性ユニットが記述されています。デフォルトの内側ユニットと、新しく作成した外側のJava EEが動作しています。「ソース」タブをクリックして、詳細を確認します。
ここで、EJBをOracle ADFフレームワーク用のデータ・コントロールとして公開します。これにより、ユーザー・インタフェースを簡単にEJBにバインドできるようになります。
アプリケーション・ナビゲータでHRFacadeBeanノードを右クリックし、コンテキストから「データ・コントロールの作成」を選択します。
「EJBインタフェースの選択」ダイアログ・ボックスで、「ローカル」を選択し、「OK」をクリックします。作業内容をすべて保存します。
アプリケーション・ユーザー・インタフェースは、一連のJSPページで構成されます。このアプリケーションでは、ビューと呼ばれるユーザー・インタフェース(UI)は別のプロジェクトで定義されます。
アプリケーションUIを作成するには、次のようにUserInterfaceという名前のプロジェクトを定義します。
アプリケーション・ナビゲータでHR_EJB_JPA_Appアプリケーションを選択し、「ファイル」メニューで「新規」を選択して、新規ギャラリを表示します。「一般」カテゴリから、「プロジェクト」を選択します。「項目」リストで、「汎用プロジェクト」を選択し、「OK」をクリックします。
「汎用プロジェクトの作成」画面で、新規プロジェクトの名前としてUserInterface
を入力し、「終了」をクリックします。
アプリケーション・ナビゲータでUserInterfaceノードを右クリックし、コンテキストから「プロジェクト・プロパティ」を選択します。
「プロジェクト・プロパティ」ダイアログでJSP Tag Librariesノードを選択します。「配布済みライブラリ」を選択し、「追加」をクリックします。
「タグ・ライブラリ」リストで、ADF Faces Components 11を選択します。「OK」をクリックします。
Technology scopeノードを選択します。「使用可能なテクノロジ」リストでJSFを選択します。JSFを選択すると、必要な関連テクノロジであるJava、JSP、およびサーブレットが自動的に伝播されることに注意してください。「OK」をクリックします。作業内容を保存します。
JDeveloperのJSF Navigation Modelerを使用して、アプリケーションのページ、およびページ間のナビゲーションをダイアグラムとして計画および作成します。
アプリケーション・ナビゲータで、UserInterface、Web Content、WEB_INFの順に開きます。faces-config.xmlをダブルクリックして、ページ・フロー・ダイアグラムを開きます。
コンポーネント・パレットの「JSFナビゲーション・ダイアグラム」ページで「JSFページ」を選択し、ページを表示するダイアグラムをクリックします。そのページの名前をbrowse
に変更します。
コンポーネント・パレットから、「JSFページ」を前のページの横にドラッグ・アンド・ドロップします。そのページの名前をquery
に変更します。
コンポーネント・パレットで「JSFナビゲーション・ケース」を選択します。コピー元のJSFページ(browse
)のアイコンをクリックし、次にナビゲーション・ケース用のコピー先JSFページ(query
)のアイコンをクリックします。
デフォルトのラベルsuccess
をクリックしてquery
と入力し、変更します。ナビゲーション・ケースの上に警告アイコンが表示されます。これは、まだJSFページを作成していないためです。この警告は、それぞれのページを作成すると表示されなくなります。
コンポーネント・パレットで「JSFナビゲーション・ケース」を選択します。コピー元のJSFページ(query
)のアイコンをクリックし、次にナビゲーション・ケース用のコピー先JSFページ(browse
)のアイコンをクリックします。そのラベルの名前をbrowse
に変更します。作業内容を保存します。
次の手順で、Department Employeesマスター・ディテール・ページのADF Facesコンポーネントを使用して、JavaServer Facesページを作成します。
ページ・フロー・ダイアグラムで、参照アイコンをダブルクリックして「JSF JSFの作成」を起動します。
ファイル名はbrowse.jspx
で、XMLドキュメントの作成オプションを選択します。「OK」をクリックします。
空のbrowse.jspx
ページが表示されます。次の手順で、データ・バウンドADF Facesコンポーネントをページに追加します。このコンポーネントは、部門とその部門に所属している従業員を表示します。
コンポーネント・パレットから、ADF Facesライブラリ用に、「レイアウト」セクションを選択し、ページに「パネル・ストレッチ・レイアウト」コンポーネントをドラッグします。
コンポーネント・パレットから、ページの中央に「パネル・スプリッタ」コンポーネントをドラッグします。カーソルが中央タグの左に表示されます。
「データ・コントロール」コンポーネント、HRFacadeLocal、queryDepartmentsFindAllの順に開き、最初のファセット内にDepartmentsノードをドラッグ・アンド・ドロップします。ポップ・アップ・メニューで「フォーム」を選択し、次に「ADF読取り専用フォーム」を選択します。
「編集フォーム」フィールドで、「ナビゲーション・コントロールを含める」オプションにチェックを付けます。「OK」をクリックします。
「データ・コントロール」でDepartmentsノードを開き、employeesListノードを選択して2番目のファセットにドロップします。ポップ・アップ・メニューで「表」を選択し、次に「ADF読取り専用表」を選択します。
「表の列の編集」ダイアログ・ボックスで、次の列を除くすべての列を削除します。
commissionPct
employeeId
firstName
hiredate
jobId
lastName
phoneNumber
salary
「行選択」と「ソート」オプションを選択します。「OK」をクリックします。
「構造」ペインでaf:panelSplitterペインを選択し、プロパティ・インスペクタで「向き」を「縦」
に設定します。
af:panelStretchLayoutタグを選択します。プロパティ・インスペクタで、「スタイル」を開きます。Employees表をレイアウト・エディタに表示するため、「ボックス」タブで「幅」を600ピクセルに、「高さ」を400ピクセルに設定します。
2番目のペインでaf:table タグを選択します。プロパティ・インスペクタで、「スタイル」を開きます。「ボックス」タブで「幅」を100ピクセルに、「高さ」を100ピクセルに設定します。
マウスを使用して線をドラッグし、ページ上のDepartmentブロックの高さを低くします。
部門間を移動したときに、このページのemployeesセクションを更新する場合があります。これには、employees表にページの部分レンダリング・トリガーを追加します。
「First」ボタンを選択し、プロパティ・インスペクタで「ID」としてfirst
を追加します。残りの3つのボタンにも同じ操作を繰り返します。「Previous」をprevious
に、「Next」をnext
に、「Last」をlast
に設定します。
ユーザーがこれらのボタンをクリックしたときに、ページの部分レンダリング・トリガーが起動されるように設定します。
employees表を選択します。プロパティ・インスペクタで、「動作」、PartialTriggersプロパティの順に開き、「編集」をクリックします。「編集」ボタンはフィールドの右端にあります。
「プロパティの編集」ダイアログ・ボックスでファセット(先頭)を開き、panelFormLayout - Departments、ファセット(フッタ)、panelGroupLayoutの順に開き、ナビゲーション・ボタンを表示します。選択したリストに4つのボタンすべてを追加します。「OK」をクリックします。
コンポーネント・パレットの「共通コンポーネント」で、「パネル・メニュー・バー」コンポーネントを選択し、ページのデザインのFacet Topタグにドロップします。「メニュー」コンポーネントをクリックし、「メニュー・バー」の内部にドロップします。
(AFBrandingBarTitle、AFHeaderLevelTwoで、従業員の参照をクリックし、Heading2を選択します。ドラッグして上部ファセットのサイズを変更します。
プロパティ・インスペクタで、「テキスト」をmenu 1
からOptions
に変更します。「動作」タブをクリックし、「連結解除」フィールドを「true」に設定します。
「構造」ペインでaf:menuタグを右クリックし、コンテキストから「af:menuの中に挿入」、「MenuItem」の順に選択します。
プロパティ・インスペクタで「共通」タブを使用して、「テキスト」をQuery
に変更し、ドロップ・ダウン・リストで「アクション」を「問合せ」
に変更します。作業内容を保存します。
次の手順で、ADF Facesを使用して、Employeesを編集するための問合せページを作成します。
「faces-config.xml」タブをクリックして、ページ・フロー・ダイアグラムに戻り、「問合せ」アイコンをダブルクリックして、ページ・ウィザードを起動します。
ファイル名はquery.jspx
で、XMLドキュメントの作成にチェックを付けます。「OK」をクリックします。
新しい「設計」ページが開きます。データ・コントロールのHRFacadeLocalノードの下で、queryEmployeesFindByName(Object)ノードを選択し、ページにドロップします。ポップアップ・メニューから、「パラメータ」、「ADFパラメータ・フォーム」の順に選択します。
「フォーム・フィールドの編集」で、「OK」をクリックして、表示されたフィールドをそのまま使用します。
「アクション・バインディングの編集」ダイアログ・ボックスで、「OK」をクリックします。
データ・コントロールでqueryEmployeesFindByNameノードを開き、Employeesノードを選択します。「パラメータ・フォーム」の下のページにドロップします。ポップアップ・メニューから、「フォーム」、「ADFパラメータ・フォーム」の順に選択します。
「フォーム・フィールドの編集」で、「ナビゲーション・コントロールを含める」チェック・ボックスと「送信ボタンを含める」チェック・ボックスにチェックを付けます。「OK」をクリックします。
このページは更新可能にする必要があります。これを指定するには、「データ・コントロール」ペインでmergeEntity(Object)メソッドを選択し、「送信」ボタンにドロップします。「アクション・バインディングの編集」ダイアログ・ボックスで、下矢印をクリックし、「EL式ビルダーの表示」を選択します。
「変数」ダイアログ・ボックスで「ADFバインディング」、「バインディング」、queryEmployeesFindByNameIterator、currentRowの順に開き、dataProviderを選択します。式で各ノードを選択すると、ウィンドウの上部の式にノードが追加されます。
「OK」をクリックします。「OK」をもう一度クリックします。「コンポーネントの再バインディングの確認」ダイアログ・ボックスで、「OK」をクリックします。
問合せの設計ページで、「mergeEntity」ボタンを選択します。
プロパティ・インスペクタの「共通」タブで、「テキスト」の値をSave
に設定し、「ボタン・アクション」セクションで、ドロップ・ダウン・リストから「アクション」を「参照」
に設定します。作業内容を保存します。