Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発 12c (12.1.3) E59441-03 |
|
![]() 前 |
![]() 次 |
この章では、ADFビュー・オブジェクトを他のビュー・オブジェクトにリンクし、Oracle ADFアプリケーションに任意の複雑さのマスター/ディテール階層を形成する方法を説明します。
この章の内容は次のとおりです。
マスター/ディテール関係は、2つのビュー・オブジェクト・インスタンスを関連付けるビュー・リンクが作成されたときに確立されます。ビュー・リンクは2つのビュー・オブジェクト間の関係を表します。通常は基礎となるデータ表間の外部キー関係に基づきますが、そうである必要はありません。ビュー・リンクは、1つのビュー・オブジェクト・インスタンス(マスター・オブジェクト)の行を別のビュー・オブジェクト・インスタンス(ディテール・オブジェクト)の1つ以上の行に関連付けます。
この章では、図6-1に示すようなビュー・オブジェクトの概念についてわかりやすく説明します。
ビュー・オブジェクトを1つ以上の他のビュー・オブジェクトにリンクして、任意の複雑さのマスター/ディテール階層を作成できます。
実行時にマスター・ビュー・インスタンスの現在行に合せてディテール・ビュー・インスタンスが能動的に調整されるように、アプリケーション・モジュールのコンテキスト内で親子のビュー・オブジェクト・インスタンスを調整できます。
設計時にビュー・リンク・アクセッサを定義できます。ビュー・リンク・アクセッサは、実行時にディテール・コレクション行セットを返すためにマスター・コレクションで使用されるアクセッサ属性を指定します。
マスター/ディテール関係のマスター・ビュー・オブジェクトに指定するビュー・リンク・アクセッサ属性を使用して、プログラムでディテール・コレクション行セットにアクセスできます。
ディテール・ビュー・インスタンスの行セットをキャッシュしてマスター/ディテール・コレクションの問合せを調整すると、ADF Facesツリー・コンポーネントのような、ツリー内の各マスター・ノードが個別にディテール行セットを保持する必要があるUIコンポーネントをサポートできます。
ビュー基準を使用して行検索条件を作成し、マスター・ビュー・オブジェクト内の特定の行を見つけることができます。
リンク元とリンク先のビュー・リンク属性が単一の表から導出されるように自己参照型のマスター/ディテール階層を定義できます。
インライン・ビュー基準を定義して、ディテール・ビュー・オブジェクトの属性で指定された属性値を使用してマスター・ビュー・オブジェクトの行セットをフィルタリングできます。
ビュー・オブジェクトで作業を開始する前に、その他のOracle ADF機能を理解しておくと役に立つ場合があります。次に、関連する他の機能へのリンクを示します。
対話型のOracle ADFモデル・テスターを使用して、ビュー・オブジェクトの問合せ結果を検証する方法の詳細は、第8章「ビュー・インスタンスの問合せのテスト」を参照してください。
ビュー・オブジェクト・インスタンスで構成されるデータ・モデルを作成する方法の詳細は、第13章「アプリケーション・モジュールによるビジネス・サービスの実装」を参照してください。
通常、カスタム・ビュー・オブジェクト・クラスで記述、使用およびオーバーライドする一般的なコードの詳細は、付録E「ADFビジネス・コンポーネントのよく使用されるメソッド」を参照してください。
oracle.jbo
パッケージに関連するAPIのドキュメントについては、次のJavadocリファレンス・ドキュメントを参照してください。
Oracle ADFモデルJava APIリファレンス
使用する問合せは、その多くが外部キーによって関連付けられた複数の表を対象としています。このシナリオでは、関連情報を問い合せる別個のビュー・オブジェクトを作成し、ソース・ビュー・オブジェクトを1つ以上のターゲット・ビュー・オブジェクトにリンクして、マスター/ディテール階層を形成します。
この状況に対処する方法は2つあります。次のいずれかを実行できます。
ソース・ビュー・オブジェクトとターゲット・ビュー・オブジェクトが、基礎となるエンティティ・オブジェクトのアソシエーションに基づいている場合は、そのエンティティ・オブジェクト間のアソシエーションに基づいてビュー・リンクを作成します。
ソース・ビュー・オブジェクトとターゲット・ビュー・オブジェクトの関連付けを定義するビュー・リンクを作成します。
アソシエーションの有無は、エンティティ・オブジェクトがいつ作成されたかによって決まります。デフォルトでは、エンティティ・オブジェクト・アソシエーションは、データ・ソースの階層関係をモデル化しています。たとえば、外部キーで関連付けられたデータベース表に基づくエンティティ・オブジェクトは、このような関係をエンティティ・アソシエーションで取り込みます。ビュー・リンクが既存のエンティティ・アソシエーションに基づいている場合、ビュー・リンクをビュー・オブジェクトにのみ基づいて定義しても、パフォーマンス的に不利になることはありません。どちらの場合も、「ビュー・リンクの作成」ウィザードでマスター/ディテールの関係を定義します。
注意: 1つのビュー・リンクにより、2つのビュー・オブジェクト間の基本的なマスター/ディテール関係が定義されます。ただし、より多くのビュー・リンクを作成することにより、次のものを含む複雑なマスター/ディテール階層を構成できます。
このような複雑な階層を定義する手順は、ビュー・オブジェクトのみに基づいて関係を作成する場合も、エンティティ・アソシエーションを持つビュー・オブジェクトに基づいて関係を作成する場合も同じです。どちらの場合も、追加の各階層を、一度に1ビュー・リンクずつ作成する必要があります。 |
図6-2は、リンクされたマスター/ディテール問合せにより生成されたマルチレベルの結果を示しています。
ユーザーにマスター行のセットを表示し、マスター行ごとに調整されたディテール行のセットを表示する必要がある場合、ビュー・リンクを作成して、マスター・ビュー・オブジェクトとディテール・ビュー・オブジェクトをどのように関連付けるかを定義できます。たとえば、部門のマスター/ディテール階層および各部門に定義された従業員セットを作成する場合は、DeptVO
ビュー・オブジェクトとEmpVO
ビュー・オブジェクトをリンクさせます。このようなビュー・オブジェクトが既存のアソシエーションによって関連付けられたエンティティを基礎としている場合は、そのアソシエーションを選択してマスター/ディテール・ビュー・リンクを定義できます。
アソシエーション・ベースのビュー・リンクを作成するには、「ビュー・リンクの作成」ウィザードを使用します。
始める前に:
マスター/ディテール階層を作成する方法に関する知識があると役立ちます。詳細は、6.2項「マスター/ディテール階層における複数表の使用」を参照してください。
エンティティ・アソシエーションの作成方法を理解しておくと役に立つ場合があります。詳細は、4.2.3項「既存の表からのエンティティ・オブジェクトおよびアソシエーション作成時の処理」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、6.1.2項「ビュー・オブジェクトの追加機能」を参照してください。
次のタスクを完了する必要があります。
アソシエーション・ベースのビュー・リンクの作成方法:
「アプリケーション」ウィンドウで、ビュー・オブジェクトを作成するプロジェクトのパッケージ・ノードを右クリックし、「新規」、「ビュー・リンク」の順に選択します。
「ビュー・リンクの作成」ウィザードの「名前」ページで、パッケージ名とコンポーネント名を指定します。
たとえば、ビュー・リンクの目的を考えた場合、DeptToEmpFkLink
などは、リンクが外部キーに基づいており、部門リストとその従業員の間のリンクであることを示しているので、名前として有効です。
「ビュー・オブジェクト」ページの「ソース属性の選択」ツリーで、目的のパッケージのソース・ビュー・オブジェクトを開きます。「関連先属性の選択」ツリーで、リンク先ビュー・オブジェクトを開きます。
ビュー・オブジェクト属性の他にも、エンティティ・ベースのビュー・オブジェクトの場合、リストには関連するアソシエーションも表示されます。
ソースのツリーおよび宛先のツリーで同じアソシエーションを選択します。その後、「追加」をクリックして、次の表にアソシエーションを追加します。
たとえば、図6-3では、ソース
のツリーおよび宛先のツリーの両方で同じSEmpDeptIdFkAssocアソシエーションが選択されています。
「終了」をクリックします。
アソシエーションに基づくビュー・リンクの場合と同様に、ビュー・オブジェクトを他のビュー・オブジェクトに直接リンクし、任意の複雑さでマスター/ディテール階層を形成できます。唯一異なるのは、マスター・ビュー・オブジェクトとディテール・ビュー・オブジェクトのどちらも既存のアソシエーションによって関連付けられていない場合の作成手順です。この場合、これらのオブジェクトを関連付ける一連のソース属性と関連先属性のペアを取得するためのアソシエーションがないため、ベースとなるビュー・オブジェクト属性を示してビュー・リンクを作成します。
ビュー・リンクを作成するには、「ビュー・リンクの作成」ウィザードを使用します。
始める前に:
マスター/ディテール階層を作成する方法に関する知識があると役立ちます。詳細は、6.2項「マスター/ディテール階層における複数表の使用」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、6.1.2項「ビュー・オブジェクトの追加機能」を参照してください。
次のタスクを完了する必要があります。
ビュー・オブジェクト間のビュー・リンクを作成するには:
「アプリケーション」ウィンドウで、ビュー・オブジェクトを作成するプロジェクトのパッケージ・ノードを右クリックし、「新規」、「ビュー・リンク」の順に選択します。
「ビュー・リンクの作成」ウィザードの「名前」ページで、パッケージ名とビュー・リンク名を入力します。「次へ」をクリックします。
たとえば、ビュー・リンクの目的を考えた場合、OrdersPlacedBy
などは、顧客リストとその注文の間のリンクであることを示しているので、名前として有効です。
「ビュー・オブジェクト」ページで、マスターとして動作するビュー・オブジェクトからソース属性を選択します。
たとえば図6-4は、この役割を実行するCustomerVO
ビュー・オブジェクトから選択したId
属性を示しています。「次へ」をクリックします。
「ビュー・オブジェクト」ページで、ディテールとして動作するビュー・オブジェクトから、対応するリンク先属性を選択します。
たとえば、ディテール問合せにより、現在選択している顧客からの注文が表示されるようにする場合は、この役割を実行するOrdersVO
からId
属性を選択します。
「追加」をクリックし、対応する属性ペアを、下にあるソース属性とリンク先属性のペアの表に追加します。マスター/ディテール・リンクの定義が終了したら、「次へ」をクリックします。
図6-4では、ペアが1つのみ(CustomerVO.Id
、OrderVO.Id
)選択されています。ただし、マスターとディテールの間のリンクを定義するために必要な属性ペアが複数ある場合、「ビュー・オブジェクト」ページでこれらのステップを繰り返して、ソース/ターゲット属性ペアをさらに追加できます。
「ビュー・リンク・プロパティ」ページでは、「アクセッサ名」フィールドを使用して、リンク先ビュー・オブジェクトへのプログラムによるアクセスを可能にするアクセッサのデフォルト名を変更できます。
デフォルトでは、アクセッサ名は、リンク先ビュー・オブジェクトの名前と一致します。たとえば、デフォルトのアクセッサ名をOrdersVO1
からCustomerOrders
に変更すると、アクセッサで定義されるマスター/ディテール関係が明確になります。
また、「ビュー・リンク・プロパティ」ページで、ビュー・リンクが一方向と双方向のどちらを表すのかを制御できます。
デフォルトでは、ビュー・リンクは、ソース(マスター)の現在行をリンク先(ディテール)ビュー・オブジェクトの関連する行のセットにアクセスできるようにする一方向関係です。階層的なUIコンポーネント(たとえばマスター・ビュー・オブジェクトで生成されたアクセッサを持つビュー・リンク・アクセッサを必要とするデータバインドされたツリーなど)のサポートを有効にする場合は、「アクセッサの生成」のデフォルト設定はそのまま変更しないでください。
たとえば、図6-5におけるチェック・ボックスの設定では、CustomerVO
の現在行のOrdersVO
から行のディテール・コレクションにはアクセスできますが、逆方向のアクセスはできません。この場合の動作は、OrdersVOの「宛先アクセッサ」
グループ・ボックスのチェック・ボックス(「アクセッサの生成」の「ビュー・オブジェクト: CustomerVO」ボックスを選択)と、CustomerVOの「リンク元アクセッサ」
グループ・ボックスのチェック・ボックス(「アクセッサの生成」の「ビュー・オブジェクト: OrdersVO」ボックスの選択を解除)の設定によって指定します。
「ソース問合せの編集」ページで、実行時にソース・ビュー・オブジェクトのマスター行へのアクセスに使用されるビュー・リンクのSQL述語をプレビューし、「次へ」をクリックします。
「関連先問合せの編集」ページで、実行時にソース・ビュー・オブジェクトの現在行に対するリンク先ビュー・オブジェクトから相関ディテール行へのアクセスに使用されるビュー・リンクのSQL述語をプレビューし、「次へ」をクリックします。
「アプリケーション・モジュール」ページで、目的のアプリケーション・モジュールのデータ・モデルにビュー・リンクを追加し、「終了」をクリックします。
デフォルトでは、ビュー・リンクはアプリケーション・モジュールのデータ・モデルに追加されません。ビュー・リンクは、後でアプリケーション・モジュールの概要エディタを使用してデータ・モデルに追加できます。
ビュー・リンク、またはアソシエーションベースのビュー・リンクを作成する場合、JDeveloperでその宣言的設定を表すXMLドキュメントが作成され、そのパッケージの名前に対応するディレクトリ内に保存されます。たとえば、DeptToEmpFkLink
という名前のビュー・リンクが作成され、views.links
パッケージに表示された場合、プロジェクトのソース・パスに作成されるXMLファイルは、./views/links/DeptToEmpFkLink.xml
になります。このXMLファイルには、指定したソース属性とリンク先属性のペアに関する宣言情報が含まれ、ビュー・リンクがアソシエーションベースの場合は、指定したソース・ビュー・オブジェクトとリンク先ビュー・オブジェクトを関連付けるアソシエーションに関する宣言情報が含まれます。
ビュー・リンク・コンポーネント定義自体を保存するのみでなく、JDeveloperはビュー・リンク関係でのリンク元ビュー・オブジェクトのXML定義を更新して、定義したビュー・リンク・アクセッサに関する情報を追加します。これを確認するため、「アプリケーション」ウィンドウでソース・ビュー・オブジェクトを選択し、「構造」ウィンドウでその詳細を検証できます。図6-6に示すように、DeptVO
ソース・ビュー・オブジェクトのViewLink Accessorsノードの下には、リンク先のEmpVO
ビュー・オブジェクトにアクセスするデフォルトのリンク先アクセッサEmpVOAccessor
があります。これにより、ソース・ビュー・オブジェクトはビュー・リンク・アクセッサを使用して、ビュー・リンクのリンク先側を横断できます。ソース・ビュー・オブジェクトのビュー・リンク・アクセッサ定義に加えて、ビュー・リンクを直接カスタマイズすることにより、リンク先ビュー・オブジェクトにビュー・リンク・アクセッサを定義できます。
6.2.1項「エンティティ・アソシエーションに基づくマスター/ディテール階層の作成方法」で説明したように、ビュー・リンクを定義して、相関ディテールの行セットにプログラムで移動できるようにする場合、ビュー・リンクは、コードから要求された際、調整されたディテール行セットの取得に必要な情報を定義するのみという受動的な役割を担います。ビュー・リンク・アクセッサ属性が存在し、ビュー・リンクのソース・ビュー・オブジェクトの任意のインスタンスから任意の結果行でプログラムによるアクセスが可能です。つまり、プログラムによるアクセスでは、アプリケーション・モジュールのデータ・モデルを変更する必要はありません。
ただし、マスター/ディテール・ユーザー・インタフェースは、エンタープライズ・アプリケーション内で頻繁に発生するため、マスター/ディテール画面をプログラムで調整する必要性をなくすために、ビュー・リンクをより能動的に使用することもできます。ビュー・リンクされたビュー・オブジェクトのインスタンスをアプリケーション・モジュールのデータ・モデルに 明示的に追加することにより、この能動的なマスター/ディテール調整を実行できます。
マスター/ディテールの調整を有効にするには、概要エディタでアプリケーション・モジュールを開き、「データ・モデル」ページを選択します。
始める前に:
マスター/ディテール階層を作成する方法に関する知識があると役立ちます。詳細は、6.2項「マスター/ディテール階層における複数表の使用」を参照してください。
アプリケーション・モジュールの役割を理解しておくと役に立つ場合があります。詳細は、13.1項「アプリケーション・モジュールについて」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、6.1.2項「ビュー・オブジェクトの追加機能」を参照してください。
次のタスクを完了する必要があります。
5.2.1項「エンティティ・ベースのビュー・オブジェクトの作成方法」および5.8.1項「カスタムSQLモード・ビュー・オブジェクトの作成方法」の説明に従って、目的のビュー・オブジェクトを作成します。
13.2.1項「アプリケーション・モジュールの作成方法」の説明に従って、アプリケーション・モジュールを作成します。
ビュー・オブジェクトのディテール・インスタンスを追加する方法:
「アプリケーション」ウィンドウで、新しいビュー・インスタンスを定義するアプリケーション・モジュールをダブルクリックします。
概要エディタで、「データ・モデル」ナビゲーション・タブをクリックします。
「データ・モデル」ページで、「ビュー・オブジェクト・インスタンス」セクションを展開し、 「使用可能なビュー・オブジェクト」リストで、マスター・ビュー・オブジェクトの下でインデントされたディティール・ビュー・オブジェクト・ノードを選択します。
このリストには、ディティール・ビュー・オブジェクトが、それ自体として1回、およびビュー・リンクを介するディティール・ビュー・オブジェクトとして1回の計2回表示されることに注意してください。たとえば、図6-7では、EmpVO
のラベルのビュー・オブジェクト(この場合は、強調表示されているビュー・オブジェクトの下に表示)ではなく、EmpVO via DeptToEmpFkLink
ディテール・ビュー・オブジェクトを選択しています。
「使用可能なビュー・オブジェクト」リストの下のビュー・インスタンスの名前の指定フィールドに、作成しようとしているディテール・インスタンスの名前を入力します。
たとえば、図6-7では、ディテール・ビューであるEmpVO
ビュー・オブジェクトのインスタンスの名前はEmpDetailsVO
です。
「データ・モデル」リストで、アクティブに調整するマスターにする必要があるビュー・オブジェクトのインスタンスを選択します。
「インスタンスの追加」をクリックして、データ・モデル内で現在選択されているマスター・インスタンスに、自分が選択した名前でディテール・インスタンスを追加します。
たとえば、図6-8では、「データ・モデル」リストに、ビュー・オブジェクト・インスタンスのマスター/ディテール階層(ディテール・ビュー・オブジェクトはEmpDetailsVO
)が表示されています。
マスター/ディテールのアクティブな調整をテストするには、「アプリケーション」ウィンドウのポップアップ・メニューから「実行」を選択して、アプリケーション・モジュール上でOracle ADFモデル・テスターを起動します。Oracle ADFモデル・テスターのデータ・モデル・ツリーには、マスター・ビュー・オブジェクト・インスタンスでディテール・ビュー・オブジェクト・インスタンスをアクティブに調整するビュー・リンク・インスタンスが表示されます。ツリーでビュー・リンク・インスタンス・ノードをダブルクリックすると、Oracle ADFモデル・テスターのマスター/ディテール・データ・ビュー・ページが開きます。ツールバー・ボタンを使用してマスター・ビュー・オブジェクト内で移動する(結果としてビュー・オブジェクトの現在行を変更する)場合に、調整されたディテールのセットが自動的にリフレッシュされ、ユーザー・インタフェースは同期を維持します。
マスターまたはディテールとして定義されていない別のビュー・オブジェクトをダブルクリックすると、2番目のタブが開き、そのデータが表示されます。この場合、そのビュー・オブジェクトに対してはビュー・リンクによるアクティブな調整が行われないため、その問合せはマスター・ビュー・オブジェクトの現在行による制約を受けません。
データ・モデルを編集してOracle ADFモデル・テスターを実行する方法の詳細は、8.3項「Oracle ADFモデル・テスターを使用したビュー・オブジェクト・インスタンスのテスト」を参照してください。
ビュー・リンクを効果的に使用するためには、ビュー・リンク・アクセッサ属性によりRowSet
オブジェクトが戻されることや、ディテール・コレクションへのビュー・リンク・アクセッサでのプログラムによるアクセスが可能になることを理解しておく必要があります。
実行時に、Row
オブジェクトにあるgetAttribute()
メソッドにより、ビュー・オブジェクトの名前別の結果セットで行の属性にアクセスできます。ビュー・リンク・アクセッサは、ソース・ビュー・オブジェクトの現在行の追加属性のような動作をするため、同じgetAttribute()
メソッドを使用してその値を取得できます。通常のビュー属性とビュー・リンク・アクセッサ属性との実際の相違点は、そのデータ型のみです。通常のビュー属性は、一般に303
やngreenbe
のような値を持つスカラー・データ型であるのに対し、ビュー・リンク・アクセッサ属性の値はゼロまたは1つ以上の相関ディテール行の行セットです。curUser
がOrders
ビュー・オブジェクトのいくつかのインスタンスからのRow
オブジェクトであると仮定すると、注文項目のディテール行セットを取得するための、次のコードを1行作成することができます。
RowSet items = (RowSet)curUser.getAttribute("OrderItems");
注意: ビュー行のカスタムJavaクラスを生成する場合、ビュー・リンク・アクセッサのタイプはRowIterator になります。実行時に、戻り値が必ずRowSet オブジェクトになるため、ビュー・リンク属性値をRowSet にキャストするのが安全です。 |
例6-1
に示すように、ビュー・リンク・アクセッサを使用してディテール行のRowSetオブジェクトを取得すると、ビュー・オブジェクトの結果の行セットをループする場合と同じように、それが含まれる行全体をループできます。
例6-1 ディテール・コレクションへのプログラムによるアクセス
while (items.hasNext()) { Row curItem = items.next(); System.out.println("--> (" + curItem.getAttribute("LineItemId") + ") " + curItem.getAttribute("LineItemTotal")); }
テスト・クライアントの作成の詳細は、8.4.6項「ビュー・リンク・アクセッサを使用したディテール・コレクションのアクセス方法」を参照してください。
新しいディテール行セット作成の問合せの再実行に関連する若干のオーバーヘッドがアプリケーションで発生しないようにする場合は、ビュー・リンク・アクセッサ行セットのキャッシュを有効にできます。たとえば、マスター行ビュー・アクセッサ属性が変更されないかぎり、ビュー・アクセッサ行セットは安定した状態を維持し、ADF Facesツリー・コンポーネントのようなUIコンポーネントの行セットを再作成する必要がありませんが、ツリー内の各マスター・ノードのデータは、個別のディテール行のセットを維持する必要があります。
ビュー・リンク・アクセッサのソースであるビュー・オブジェクトについて、概要エディタを使用してビュー・リンク・アクセッサ行セットの保存を有効にできます。ソース・ビュー・オブジェクトの概要エディタの「ビュー・アクセッサ」ページで、「行セットの保存」フラグを選択します。
パフォーマンスのヒント: ユーザー・インタフェース開発者がビュー・リンクを使用して、ディテール・コレクションが安定しているデータバインド型マスター・ディテール・コンポーネント(ADF Facesツリー・コンポーネントなど)を作成することが予想される場合は、「行セットの保存」フラグを有効にしてください。実行時に、この設定によってディテール・コレクションごとにアクセッサが1回実行されます。パフォーマンスにおけるこの改善の代償としては、フラグを有効にせずにディテール・コレクションにアクセスすることに比べて、アクセスされるコレクションではより多くのメモリー領域を占有する場合があります。 |
ビュー・リンク・アクセッサ行セットの保存を有効にするには:
「アプリケーション」ウィンドウで、ビュー・リンクを定義するソース・ビュー・オブジェクトをダブルクリックします。
概要エディタで、「ビュー・アクセッサ」ナビゲーション・タブをクリックします。
「ビュー・アクセッサ」ページで「ビュー・リンク・アクセッサ」セクションを開き、「行セットの保存」チェック・ボックスを選択します。
エンティティ・ベースのビュー・オブジェクトをリンクしてマスター/ディテール階層を形成すると通常、ビュー・オブジェクトとこれらの各慣用名がアソシエーションによって関連付けられます。実行時に、アソシエーションにより内部アソシエーション・ビュー・オブジェクトが作成され、これによって問合せの実行が有効になり、マスター/ディテール調整が有効にされます。アソシエーションに参加するエンティティ・オブジェクトが非永続属性のみで構成される場合は、このシナリオに例外が発生します。実行時にプログラムで移入する一時属性でエンティティ・オブジェクトを定義すると、これが発生する場合があります。この場合、非永続エンティティ・オブジェクトにリンクするアソシエーション概要エディタを使用して、アソシエーション・ビュー・オブジェクトを選択し、問合せを実行できます。
始める前に:
アソシエーションの知識があると役立ちます。詳細は、4.2.3項「既存の表からのエンティティ・オブジェクトおよびアソシエーション作成時の処理」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、6.1.2項「ビュー・オブジェクトの追加機能」を参照してください。
次のタスクを完了する必要があります。
5.2.1項「エンティティ・ベースのビュー・オブジェクトの作成方法」の説明に従って、非永続エンティティ・オブジェクト用にエンティティ・ベースのビュー・オブジェクトを作成します。
「アソシエーションの作成」ウィザードを使用して、非永続エンティティ・オブジェクトとデータベース派生エンティティ・オブジェクトとの間におけるアソシエーションを作成します。アソシエーションの作成の詳細は、4.3項「アソシエーションの作成および構成」を参照してください。
非永続エンティティ・オブジェクトのアソシエーションをカスタマイズするには:
「アプリケーション」ウィンドウで、カスタマイズするアソシエーションをダブルクリックします。
概要エディタで「チューニング」ナビゲーション・タブをクリックし、「カスタム・ビュー・オブジェクト」セクションの「アクセッサの編集」アイコンをクリックします。
「カスタム・ビュー」ダイアログで、非永続エンティティ・オブジェクトの「カスタム・ビュー・オブジェクトの使用」を選択します。
「ビュー・オブジェクトの選択」リストで、非永続エンティティ・オブジェクトに基づいて作成したビュー・オブジェクトを選択します。
「OK」をクリックします。
行検索は、ビュー基準を使用して行セットの中の特定の行を見つけるためにアプリケーションで使用されるオブジェクトです。マスター行セットに対して行検索を起動して、ディテール行セットにより提供された1つ以上の一致する基準属性を特定できます。
現在は、実行時に行キー以外の属性の参照が必要な場合に、次のマスター/ディテール・シナリオで、設計時に定義した行検索を参加させることができます。
ADFビジネス・コンポーネントWebサービスで行検索を公開する場合。エンド・ユーザーは、マスター・サービス・ビュー・インスタンスの特定の行(行検索にマップされた、ディテール・サービス・ビュー・インスタンスの1つ以上の属性値に一致する)に対して行更新を開始できます。このユースケースの詳細は、5.11.3項「ビュー基準と行検索の使用方法に関する必知事項」を参照してください。
行検索にマップされた、ディテール・ビュー・インスタンスの1つ以上の非キー属性値に一致するマスター・ビューの行セットを、アプリケーションでプログラムにより取得する場合。このユースケースの詳細は、5.11.4項「プログラムによる行検索の呼出し」を参照してください。
注意: ビュー・オブジェクトで定義する行検索は、現在のところADFビジネス・コンポーネント・データ・コントロールのビュー・プロジェクト用にはサポートされていません。したがって、アプリケーションによって「データ・コントロール」パネルでコレクションとして公開されるビュー・オブジェクトの行検索マップ属性は、行検索の参照操作に関与しません。 |
ビュー基準により定義されるビュー基準属性は、必ずしも行のキー属性である必要はなく、ディテール・ビュー・オブジェクトで定義された任意の属性でかまいません。たとえば、PersonVO
がマスター・ビュー・オブジェクト、AddressVO
がディテール・ビュー・オブジェクトであるマスター/ディテール関係で、属性EmailAddress
により、AddressVO
の行セット内で個人の電子メール・アドレスが一致する個人行が特定されるとします。
ディテール・ビュー・オブジェクトから提供される基準属性を使用してマスター・ビュー・オブジェクトの行を特定する行検索を作成するには、次の手順を実行します。
マスター・ビュー・オブジェクトに、ディテール・ビュー・オブジェクトを参照するためのインライン・ビュー基準を定義し、バインド変数で定義されたビュー基準アイテムとして基準属性を指定します。
マスター・ビュー・オブジェクトに、各基準属性の値を受け取る更新可能な一時属性を定義します。実行時に、一時属性をプログラムで設定するかWebサービス・ペイロードで公開して、エンド・ユーザーが基準属性値(電子メール・アドレスなど)を入力できるようにすることができます。
ビュー基準を選択し、各基準属性のバインド変数をマスター・ビュー・オブジェクトの対応する一時属性に設定して、マスター・ビュー・オブジェクトに行検索を定義します。
マスター・ビュー・オブジェクトの行セットをフィルタリングするために定義する行検索は、全体がマスター・ビュー・オブジェクトで定義されます。行検索では、インライン・ビュー基準内に指定された基準属性と実行時に取得された値が照合されます。基準属性値を受け取るために、マスター・ビュー・オブジェクトでは一時属性を定義できます。この一時属性は、アプリケーションがビュー・オブジェクトに対して行検索メソッドを使用してプログラムで設定するか、Webサービス・ペイロードが公開して、ユーザーにより提供された値を受け取ることができます。
行検索を定義するには、マスター・ビュー・オブジェクトの概要エディタの「行検索」ページを使用します。エディタで、選択したビュー基準の各バインド変数の値のソースを定義します。ビュー・オブジェクトの属性と、属性と値の式は、どちらも行検索によって定義されたバインド変数のソースとして有効です。
図6-9の概要エディタには、ビュー基準findPersonByEmail
で指定されたビュー基準のバインド変数EmailBindVar
を、マスター・ビュー・オブジェクトPersonVO
によって定義された一時属性TrEmailAddress
(値のソース)にマップする行検索が表示されています。
始める前に:
マスター/ディテール・ビュー・オブジェクトの行検索に関する知識が役立つ場合があります。詳細は、6.2.8項「行検索を使用したマスター・ビュー・オブジェクトの行の検索方法」を参照してください。
マスター/ディテール・ビュー・オブジェクトに関する知識が役立つ場合があります。詳細は、6.1項「マスター/ディテール・ビュー・オブジェクトについて」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、6.1.2項「ビュー・オブジェクトの追加機能」を参照してください。
次のタスクを完了する必要があります。
6.2.1項「エンティティ・アソシエーションに基づくマスター/ディテール階層の作成方法」または6.2.2項「ビュー・オブジェクトのみに基づくマスター/ディテール階層の作成方法」の説明に従って、目的のマスター/ディテール・ビュー・オブジェクトを作成します。
6.4項「ビュー基準でのマスター/ディテール関連ビュー・オブジェクトの使用」の説明に従って、マスター・ビュー・オブジェクトにインライン・ビュー基準を定義します。インライン・ビュー基準では、ディテール・ビュー・オブジェクトが参照され、1つ以上のディテール属性がビュー基準アイテムとして指定されます。
5.5項「ビュー・オブジェクトへの計算属性および一時属性の追加」の説明に従って、必要に応じてマスター・ビュー・オブジェクトに更新可能な一時属性を追加します。一時属性は、アプリケーションでプログラムによって設定するか、ADFビジネス・コンポーネントWebサービス・ペイロードで公開して、エンド・ユーザーに値を要求できます。基準参照値を受け取るには、一時属性を更新可能として定義する必要があります。
マスター・ビュー・オブジェクトの行検索を作成する手順:
「アプリケーション」ウィンドウで、新しい行検索でカスタマイズするマスター・ビュー・オブジェクトをダブルクリックします。
概要エディタで、「行検索」ナビゲーション・タブをクリックし、「行検索の追加」ボタンをクリックします。
「名前」フィールドで、行検索の名前を変更します。
たとえば、電子メール・アドレスから個人のレコードを特定する目的で定義する行検索であれば、PersonByEmailFinder
などの名前です。
「行検索」リストで新しい行検索を選択し、「ビュー基準」ドロップダウンで、ビュー・オブジェクトの行セットをフィルタリングする行基準を選択します。
図6-9のように、目的の行検索が強調表示されます。行検索で使用するビュー基準を作成していない場合、ビュー基準のリストは空になります。
ADFビジネス・コンポーネントWebサービスのエンド・ユーザーが値を指定するようにする場合は、「属性」を選択したままにしてリストからバインド変数を選択し、「属性」ドロップダウンで、実行時にバインド変数の値を提供するマスター・ビュー・オブジェクトの一時属性を選択します。
ここで選択する一時属性は、行検索が基準の属性値を指定するために使用されます。たとえば、AddressVO
の電子メール・アドレスに基づいて行を照合するマスター・ビュー・オブジェクトPersonVO
には、TrEmailAddress
という名前で定義した一時属性が含まれている可能性があります。
注意: ビュー・オブジェクトの概要エディタで一時属性を作成する際には、基準参照値を受け取れるようにするために、その一時属性を「更新可能」として定義してください。
行検索で一致が許可される行数を指定する場合は、「すべてをフェッチ」の選択を解除します。
「フェッチ制限」に行数を入力した場合は、さらに「制限超過エラー」を選択することで、「フェッチ制限」で指定された数を超えた一致行がデータベースに存在する場合に、Oracle ADFで例外をスローできるようになります。
マスター・ビュー・オブジェクトの行検索を作成する場合は、行検索自体の定義も含めて、行検索で必要とされるすべてのメタデータをビュー・オブジェクト定義に含めます。例6-2に示すように、行検索PersonByEmailFinder
のメタデータとして、ビュー・オブジェクト定義には、<Variable>
要素にバインド変数EmailBindVar
、<ViewAttribute>
要素に一時属性TrEmailAddress
、<ViewCriteria>
要素にビュー基準findPersonByEmail
およびインライン・ビュー基準AddressVONestedCriteria
があり、最後に<RowFinders>
要素に行検索PersonByEmailFinder
が含まれています。
行検索の<VarAttributeMapping>
サブ要素は、ビュー基準のバインド変数EmailBindVar
をマスター・ビュー・オブジェクトの一時属性TrEmailAddress
にマップしています。これにより、エンド・ユーザーが実行時に値を指定し、アプリケーションで必要な基準属性を使用して行検索を起動できるようになっています。インラインの<ViewCriteriaItem>
サブ要素は、ディテール・ビュー・オブジェクトの基準属性EmailAddress
を、バインド変数の値に設定しています。
実行時にマスター・ビュー・オブジェクトで行検索が起動されると、1つ以上のディテール基準属性により、マスター行セットから一致する行が特定されます。この例では、電子メール・アドレスを使用して、その電子メール・アドレスが属している個人が照合されています。行検索では、行のキー値を渡さなくても個人のレコードが特定されます。
例6-2 マスター・ビュー・オブジェクトに定義された行検索
<ViewObject xmlns="http://xmlns.oracle.com/bc4j" Name="PersonVO" SelectList="PersonEO.ID, PersonEO.FIRST_NAME PersonEO.LAST_NAME" FromList="PERSON PersonEO" ... <Variable Name="EmailBindVar" Kind="viewcriteria" Type="java.lang.String"/> <EntityUsage Name="PersonEO" Entity="model.entities.PersonEO"/> ... <ViewAttribute Name="TrEmailAddress" IsUpdateable="false" IsSelected="false" IsPersistent="false" PrecisionRule="true" Type="java.lang.String" ColumnType="CHAR" AliasName="VIEW_ATTR" SQLType="VARCHAR"/> <ViewCriteria Name="findPersonByEmail" ViewObjectName="model.views.PersonVO" Conjunction="AND"> ... <ViewCriteriaRow Name="PersonVOCriteria_row_0" UpperColumns="1"> <ViewCriteriaItem Name="PersonVOCriteria_PersonVOCriteria_row_0_AddressVO" ViewAttribute="AddressVO" Operator="EXISTS" Conjunction="AND" IsNestedCriteria="true" Required="Optional"> <ViewCriteria Name="AddressVONestedCriteria" ViewObjectName="model.views.AddressVO" Conjunction="AND"> <ViewCriteriaRow Name="AddressVONestedCriteria_row_0" UpperColumns="1"> <ViewCriteriaItem Name="AddressVONestedCriteria_row_0_EmailAddress" ViewAttribute="EmailAddress" Operator="=" Conjunction="AND" Value=":EmailBindVar" IsBindVarValue="true" Required="Optional"/> </ViewCriteriaRow> </ViewCriteria> </ViewCriteriaItem> </ViewCriteriaRow> </ViewCriteria> ... <RowFinders> <AttrValueRowFinder Name="PersonByEmailFinder" FetchLimit="1"> <ViewCriteriaUsage Name="findPersonByEmail" FullName="model.views.PersonVO.findPersonByEmail"/> <VarAttributeMap> <VariableAttributeMapping Variable="EmailBindVar" Attribute="TrEmailAddress"/> </VarAttributeMap> </AttrValueRowFinder> </RowFinders> </ViewObject>
再帰的なデータ・モデルは、単一の表に基づくマスター/ディテール関係の関連元属性と関連先属性の名前を指定する単一の問合せを活用するものです。通常のマスター/ディテール関係では、関連元属性はマスター・ビュー・オブジェクトの主キー属性によって指定され、関連先属性はディテール・ビュー・オブジェクトの外部キー属性によって指定されます。たとえば、一般的なマスター/ディテール関係では、DEPARTMENT
表のDepartmentId
属性と、対応するEMPLOYEE
表のDepartmentId
属性が関連付けられます。しかし、再帰的モデルでは、関連元属性EmployeeId
と関連先属性ManagerId
がともにEMPLOYEE
表に存在します。したがって、この関係に対する問合せで使用するのは、単一のビュー・オブジェクトのみです。このシナリオでは、両方の属性を指定する単一のベース・エンティティ・オブジェクトのビュー・オブジェクトを作成してから、自己参照型のビュー・リンクを定義し、このビュー・オブジェクトを「関連元」ビュー・オブジェクトおよび「関連先」ビュー・オブジェクト両方として構成してマスター/ディテール階層を形成します。
ビュー・リンクを作成したら、2つの方法でデータ・モデル・プロジェクトの再帰的マスター/ディテール階層を操作できます。次のいずれかを実行できます。
同一のビュー・オブジェクトの2つのインスタンス(ビュー・リンク・インスタンスによって能動的に調整され、マスターとしての役割を果たすものと、ディテールとしての役割を果たすもの)を公開するデータ・モデルを作成します。これは、2つの別々の表で同時に単一レベルのマスター行とディテール行を表示する必要があるときに有益です。
ビュー・オブジェクトの単一のインスタンスのみを公開するデータ・モデルを作成し、各行のビュー・リンク・アクセッサ属性を使用してディテール行セットにアクセスします。再帰的マスター/ディテール階層のデータが存在する任意のレベルを表示(またはプログラム的に操作)できるため、2つのうち、この方法が一般的に使用されます。たとえば、tree
またはtreeTable
コンポーネントの再帰的階層を表示する場合は、31.4.1項「ツリーでのマスター/ディテール・オブジェクトの表示方法」で説明されているように、このアプローチを使用します。
再帰的マスター/ディテール階層では、ビュー・リンクで選択するリンク元およびリンク先のビュー・オブジェクトの属性は、通常、基礎となるエンティティ・オブジェクト間の自己参照型アソシエーションを定義する属性ペアと同じになります(このアソシエーションが存在する場合)。基礎をなすこのアソシエーションはビュー・リンクの作成には不要ですが、これによりビュー・リンクの作成が容易になるため、まず、ビュー・オブジェクトのベース・エンティティ・オブジェクトに対する外部キーを作成します。
再帰的マスター/ディテール階層を作成するには:
ビュー・オブジェクトのベース・エンティティ・オブジェクトを使用して、自己参照型ビュー・リンクを作成します。
階層の「ルート」に表示する行のみを含めるようにビュー・インスタンスの結果をフィルタリングするビュー基準を持ったビュー・オブジェクトを公開します。
アソシエーションを作成するには、「アソシエーションの作成」ウィザードを使用します。「ビュー・リンクの作成」ウィザードを使用するときに、このアソシエーションが選択肢として表示されます。関連元ビュー・オブジェクトと関連先ビュー・オブジェクトに対して選択するアソシエーションでは、単一のデータベース表から導出された同じエンティティ・オブジェクトの名前を指定するため、このビュー・リンクは自己参照型になります。
始める前に:
再帰的なデータ・モデルに関する知識が役立つ場合があります。詳細は、6.3項「再帰的なマスター/ディテール階層における単一表の使用」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、6.1.2項「ビュー・オブジェクトの追加機能」を参照してください。
次のタスクを完了する必要があります。
ビュー・リンクを作成する場合、エンティティ・オブジェクトの関連元属性と関連先属性間のアソシエーションは推測されません。再帰的階層をサポートするために、「アソシエーションの作成」ウィザードを使用して、関連元属性と関連先属性間のアソシエーションを作成できます。「エンティティ・オブジェクト」ページで、同一のエンティティ・オブジェクトを選択して関連元属性と関連先属性を指定し、ウィザードの他のすべてのデフォルト設定をそのままにします。アソシエーションの作成の詳細は、4.3項「アソシエーションの作成および構成」を参照してください。
たとえば、再帰的マスター/ディテール階層に、管理階層に基づく従業員のリストを表示するとします。このシナリオでは、Employees
エンティティ・オブジェクトに基づいてアソシエーションを作成します。「アソシエーションの作成」ウィザードの「エンティティ・オブジェクト」ページで、関連元属性としてEmployees.EmployeeId
を、関連先属性としてEmployee.ManagerId
を選択します。エンティティ・オブジェクトEmployees
によって両方の属性が指定されるため、このアソシエーションは自己参照型になります。
アソシエーション・ベースの自己参照型ビュー・リンクを作成するには:
「アプリケーション」ウィンドウで、ビュー・オブジェクトを作成するプロジェクトを右クリックし、「新規」を選択します。
「ビュー・リンクの作成」ウィザードでパッケージ名の入力を省略するには、「アプリケーション」ウィンドウで、linksパッケージ・ノードのポップアップ・メニューから「新規」、「ビュー・リンク」の順に選択します。
「新規ギャラリ」で、「ビジネス層」を展開し、「ADFビジネス・コンポーネント」を選択してから、「ビュー・リンク」を選択し、「OK」をクリックします。
「ビュー・リンクの作成」ウィザードの「名前」ページで、パッケージ名とコンポーネント名を指定します。
「ビュー・オブジェクト」ページの「ソース属性の選択」ツリーで、目的のパッケージのソース・ビュー・オブジェクトを開きます。「関連先属性の選択」ツリーで、リンク先ビュー・オブジェクトを開きます。
ビュー・オブジェクト属性の他にも、エンティティ・ベースのビュー・オブジェクトの場合、リストには関連するアソシエーションも表示されます。
ソースのツリーおよび宛先のツリーで同じアソシエーションを選択します。その後、「追加」をクリックして、次の表にアソシエーションを追加します。
たとえば、図6-10では、関連元
のツリーおよび関連先のツリーの両方で同じEmpManagersFkAssocアソシエーションが選択されています。アソシエーションの定義で、同じエンティティ・オブジェクト(この場合はEmployees
)上で関連元属性と関連先属性が指定されているため、このビュー・リンクは自己参照型です。
「ビュー・リンク・プロパティ」ページで、デフォルトの選択をそのままにしますが、関連先アクセッサのアクセッサ名を意味のわかりやすい名前に変更します。
たとえば、図6-11では、関連先アクセッサ名はEmployeesView
からStaffList
に変更されています。この名前は、ユーザー・インタフェース開発者がこのアクセッサを選択してADF Facesツリー・コンポーネントを移入するときにバインディング・エディタで公開されます。ここで指定する名前により、UI開発者はこのアクセッサの目的(このケースでは、各管理者に関連付けられた従業員リストの生成)を理解します。
「終了」をクリックします。
プロジェクトのデータ・モデルのビュー・オブジェクトを公開する準備ができたら、ビュー基準を使用してツリーのルートの最初の値をフィルタリングするように、データ・モデルのビュー・インスタンスを構成します。たとえば、再帰的マスター/ディテール階層に、管理階層に基づく従業員のリストを表示するとします。このシナリオでは、階層全体のルート値にする従業員の従業員IDを指定するように、ビュー基準のバインド変数を構成します。この場合、管理者と従業員の再帰的階層のルート値は、組織で最高レベルの管理者の従業員IDにします。
始める前に:
再帰的なデータ・モデルに関する知識が役立つ場合があります。詳細は、6.3項「再帰的なマスター/ディテール階層における単一表の使用」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、6.1.2項「ビュー・オブジェクトの追加機能」を参照してください。
次のタスクを完了する必要があります。
エンティティ・ベースのビュー・オブジェクトを作成し、階層の「ルート」に表示する行のみを含めるようにビュー・インスタンスの結果をフィルタリングするビュー基準を作成します。バインド変数を使用してビュー・オブジェクトをフィルタリングするビュー基準の作成の詳細は、5.9項「名前付きビュー基準の処理」を参照してください。
たとえば、管理者と従業員の再帰的階層で、エンティティ・ベースのビュー・オブジェクトEmployeesView
を作成します。「アソシエーションの作成」ウィザードでビュー・オブジェクトを作成したら、概要エディタの「問合せ」ページで、階層の最上部に表示する従業員を特定するバインド変数とビュー基準を作成します。階層のルートに表示する従業員を1人にする必要がある場合、このシナリオのビュー基準では、従業員ID(関連元属性に対応)のバインド変数を使用してフィルタリングすると、「ビュー基準の作成」ダイアログに表示されるWHERE
句は、((Employees.EMPLOYEE_ID = :TheEmployeeId ))
のようになります(TheEmployeeId
はバインド変数名)。バインド変数を使用してビュー・オブジェクトをフィルタリングするビュー基準作成の詳細は、5.12.2.1項「カスケード・リストを制御するデータ・ソース・ビュー・オブジェクトの作成」を参照してください。
既存のアプリケーション・モジュールにビュー・オブジェクト・インスタンスを定義するには:
「アプリケーション」ウィンドウで、新しいビュー・インスタンスを定義するアプリケーション・モジュールをダブルクリックします。
概要エディタで、「データ・モデル」ナビゲーション・タブをクリックします。
「データ・モデル」ページで、「ビュー・オブジェクト・インスタンス」セクションを展開し、 「使用可能なビュー・オブジェクト」リストで、フィルタリング対象のビュー基準を定義したビュー・オブジェクト定義を選択します。
リストの下の「新規ビュー・インスタンス」フィールドに、データ・モデルに追加するビュー・オブジェクトの次のインスタンスを識別する際に使用される名前が示されます。
ビュー・オブジェクトを追加する前に名前を変更するには、「新規ビュー・インスタンス」フィールドに別の名前を入力します。
目的のビュー・オブジェクトを選択し、「データ・モデル」リストに移動します。
図6-12では、ビュー・オブジェクトEmployeesView
の名前をEmployees
に変更してから、「データ・モデル」リストに移動しています。
ビュー・オブジェクト・インスタンスをフィルタリングして階層のルート値を指定するには、追加したビュー・オブジェクト・インスタンスを選択し、「編集」をクリックします。
「ビュー・インスタンスの編集」ダイアログで、作成したビュー基準を「選択されたもの」リストに移動し、階層のルートに対応するバインド・パラメータ値を入力します。
図6-13は、ビュー・オブジェクトのByEmployeeId
ビュー基準と、階層の最高レベルの従業員に対応する値100
に設定されているバインド・パラメータTheEmployeeId
を示しています。
「OK」をクリックします。
自己参照型ビュー・リンクを作成する場合、JDeveloperでその宣言的設定を表すXMLドキュメント・ファイルが作成され、そのパッケージの名前に対応するディレクトリ内に保存されます。このXMLファイルには、選択したアソシエーションで指定した関連元属性と関連先属性のペアに関する宣言情報と、選択した関連元および関連先ビュー・オブジェクトを関連付けるアソシエーションに関する宣言情報が含まれます。
例6-3では、EmpManagerFkLink
のXMLドキュメント・ファイルで、関連元と関連先に同じビュー・オブジェクトEmployeesView
が定義されています。
例6-3 XMLで定義された自己参照型ビュー・リンク
<ViewLink xmlns="http://xmlns.oracle.com/bc4j" Name="EmpManagerFkLink" EntityAssociation="test.model.EmpManagerFkAssoc"> <ViewLinkDefEnd Name="EmployeesView1" Cardinality="1" Owner="test.model.EmployeesView" Source="true"> <DesignTime> <Attr Name="_finderName" Value="ManagerIdEmployeesView"/> <Attr Name="_isUpdateable" Value="true"/> </DesignTime> <AttrArray Name="Attributes"> <Item Value="test.model.EmployeesView.EmployeeId"/> </AttrArray> </ViewLinkDefEnd> <ViewLinkDefEnd Name="EmployeesView2" Cardinality="-1" Owner="test.model.EmployeesView"> <DesignTime> <Attr Name="_finderName" Value="StaffList"/> <Attr Name="_isUpdateable" Value="true"/> </DesignTime> <AttrArray Name="Attributes"> <Item Value="test.model.EmployeesView.ManagerId"/> </AttrArray> </ViewLinkDefEnd> </ViewLink>
ビュー・リンク・コンポーネント定義自体が保存されるだけでなく、JDeveloperによりビュー・オブジェクトのXML定義も更新され、定義されたビュー・リンク・アクセッサに関する情報が追加されます。これを確認するため、「アプリケーション」ウィンドウでビュー・オブジェクトを選択し、「構造」ウィンドウでその詳細を検証できます。図6-14に示すように、EmpManagerFkLinkビュー・リンクのEmployeesView
ビュー・オブジェクトに定義されたアクセッサは、「ビュー・リンク・アクセッサ」
ノードに表示されています。
ビュー基準を使用すると、ビュー・オブジェクト自体の問合せに適用されるビュー・オブジェクト問合せフィルタを宣言的な方法で定義できます。ディテール・ビュー・オブジェクトの属性を使用してマスター・ビュー・オブジェクトをフィルタリングしなければならない場合があります。マスター・ビュー・オブジェクトとディテール・ビュー・オブジェクトが関係するビュー基準は、EXISTS
演算子と、問合せフィルタを定義するためのインライン・ビュー基準に依存しています。EXISTS
演算子により、インライン・ビュー基準はディテール・ビュー・オブジェクトを参照し、基準アイテムとして選択された属性を適用できます。たとえば、ビュー基準を行検索と組み合せて使用すると、マスター行セットをフィルタリングし、ディテール・ビュー・オブジェクトの基準アイテムを使用して行セットの特定の行を見つけることができます。
マスター・ビュー・オブジェクトにビュー基準を定義する場合は、そのビュー・オブジェクトの概要エディタの「ビュー基準」ページを使用します。たとえば、ディテールAddressVO
のEmailAddress
属性を使用してマスターPersonVO
の行をフィルタリングするビュー基準findPersonByEmail
は、例6-4のようになります。この例では、ディテール・ビュー・オブジェクトAddressVO
の電子メール属性の値を実行時に取得するために、ビュー基準の文にバインド変数EmailBindVar
が使用されています。
例6-4 ビュー基準のEXISTS文
( (EXISTS(SELECT 1 FROM ADDRESS AddressEONQ1 WHERE (UPPER(AddressEONQ1.EMAIL_ADDRESS LIKE UPPER (:EmailBindVar || '%') ) ) AND (PersonEO.PERSON_ID = AddressEONQ1.PERSON_ID) ) ) )
始める前に:
マスター・ビュー・オブジェクトに作用する行検索に関する知識が役立つ場合があります。詳細は、6.2.8項「行検索を使用したマスター・ビュー・オブジェクトの行の検索方法」を参照してください。
ビュー基準に関する知識が役立つ場合があります。詳細は、5.9項「名前付きバインド変数の処理」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、6.1.2項「ビュー・オブジェクトの追加機能」を参照してください。
次のタスクを完了する必要があります。
インライン・ビュー基準を作成する手順:
「アプリケーション」ウィンドウで、新しいインライン・ビュー基準でカスタマイズするマスター・ビュー・オブジェクトをダブルクリックします。
インライン・ビュー基準の作成先のビュー・オブジェクトは、マスター/ディテール階層のマスター・ビュー・オブジェクトである必要があります。
概要エディタで、「ビュー基準」ナビゲーション・タブをクリックし、「新規ビュー基準の作成」ボタンをクリックします。
「ビュー基準の作成」ダイアログで、ビュー基準の名前を入力し、アプリケーション内での用途を識別できるようにします。
たとえば、個人の行セットを従業員の電子メールでフィルタリングするには、findPersonByEmail
のようなビュー基準名を指定します。
「問合せ実行モード」ドロップダウン・リストで、デフォルトの「データベース」を選択したままにします。
デフォルト・モードでは、ビュー・オブジェクトの問合せで指定されたデータベース表をビュー基準でフィルタリングできます。
「基準の定義」タブで、「アイテムの追加」をクリックして、ビュー基準を定義します。
ビュー基準階層で、「グループ」の下にある割り当てられていないビュー基準アイテム・ノードを選択し、「基準アイテム」セクションで「属性」ドロップダウンを選択して、リストからディテール・ビュー・オブジェクトを選択します。
現在編集中のビュー・オブジェクトにビュー・リンクが存在している場合は、ディテール・ビュー・オブジェクトを選択して、インラインにネストされたビュー基準を持つビュー基準を作成できます。ディテール・ビュー・オブジェクトの名前が「属性」ドロップダウン・リストに表示されます。たとえば、例6-4
に示すように、PersonVO
はAddressVO
にリンクされ、findPersonByEmail
のビュー基準定義により、ディテール・ビュー・オブジェクトAddressVO
の属性でマスター・ビュー・オブジェクトPersonVOがフィルタリングされます。
「演算子」と「オペランド」のデフォルトの選択肢は変更しないでおきます。
ビュー・オブジェクトの基準アイテムを含むインライン・ビュー基準を作成する場合は、デフォルトの選択肢として、エディタに演算子「存在する」とオペランド「インライン・ビュー基準」が指定されます。実行時、EXISTS
演算子はディテール・ビュー・オブジェクトに属性値が存在するかどうかをテストし、マスター・ビュー・オブジェクトの行をフィルタリングします(例6-4を参照)。
ビュー基準階層で、「グループ」の下にある新しいビュー基準アイテム・ノードを選択し、「基準アイテム」セクションで次のように入力します。
「属性」ドロップダウンで、フィルタ基準とするディテール・ビュー・オブジェクトの属性を選択します。
ディテールの属性は、マスター・ビュー・オブジェクトをフィルタリングするために使用される属性です。基準アイテムにバインド変数が定義されている場合は、この属性の値をエンド・ユーザーが指定できます。
「演算子」ドロップダウンで、必要なフィルタ演算子を選択します。
「オペランド」ドロップダウンで、「バインド変数」を選択し、ディテールの属性のバインド変数名を指定します。ビュー基準にすでに変数が定義されている場合は、「パラメータ」ドロップダウン・リストから選択します。そうでない場合は、「新規」をクリックして「新規変数」ダイアログを表示し、そこでビュー基準に対する新しいバインド変数の名前を指定します。
注意: ビュー基準で使用する既存のバインド変数をドロップダウン・リストから選択する場合は、ビュー・オブジェクトの問合せ用に定義されたバインド変数を選択しないでください(これらは概要エディタの「問合せ」ページに表示されます)。概要エディタの「ビュー基準」ページで定義したバインド変数のみを選択してください。
実行時に指定される値が大文字か小文字かに基づいた、大/小文字を区別した属性のフィルタリングを無効にする場合は、「大/小文字を区別しない」が選択された状態のままにします。
このオプションは、String型の属性に対してのみサポートされています。デフォルトでは、大/小文字の区別のある検索は使用できません。
「検証」ドロップダウン・リストでは、デフォルトである「オプション」を選択したままにします。
「オプション」を選択すると、値がNULL
でない場合にのみビュー基準(または検索フィールド)がWHERE
句に追加されます。新規の各ビュー基準アイテムに対してデフォルトの「オプション」を選択すると、NULL値に対しても例外は生成されません。たとえば、図6-16
は、findPersonByEmail
ビュー基準定義により、ディテール・ビュー・オブジェクトAddressVO
のEmail
属性でマスター・ビュー・オブジェクトPersonVOがフィルタリングされ、値がNULLでも許可されることを示しています。
「OK」をクリックします。
概要エディタの「ビュー基準」ページでバインド変数を選択し、「詳細」セクションのデフォルトの設定は、次のように、変更しないでおきます。
「リテラル」は選択したままにしますが、デフォルト値は指定しないでください。値は実行時にエンド・ユーザーから取得されます。
「更新可能」を選択したままにして、バインド変数の値がユーザー・インタフェースから定義されるようにします。
「ビュー基準」ページで「UIヒント」タブをクリックし、「ラベル」、「フォーマットの種類」、「フォーマット」マスクなどのヒントを指定します。
名前付きバインド変数の値を入力できる検索ページなどのユーザー・インタフェースを作成する場合、ビュー・レイヤーではバインド変数のUIヒントが使用されます。フォーマットは、Date
型または任意の数値データ型で定義されたバインド変数でのみサポートされることに注意してください。