6 マスター/ディテール関連のビュー・オブジェクトの定義

この章では、ADFビュー・オブジェクトを他のビュー・オブジェクトにリンクし、Oracle ADFアプリケーションに任意の複雑さのマスター/ディテール階層を形成する方法を説明します。

この章の内容は次のとおりです。

マスター/ディテール・ビュー・オブジェクトについて

ADFビュー・オブジェクトから単一または複数のビュー・オブジェクトへのリンクを作成し、マスタ/ディテール階層を作成できます。

マスター/ディテール関係は、2つのビュー・オブジェクト・インスタンスを関連付けるビュー・リンクが作成されたときに確立されます。ビュー・リンクは2つのビュー・オブジェクト間の関係を表します。通常は基礎となるデータ表間の外部キー関係に基づきますが、そうである必要はありません。ビュー・リンクは、1つのビュー・オブジェクト・インスタンス(マスター・オブジェクト)の行を別のビュー・オブジェクト・インスタンス(ディテール・オブジェクト)の1つ以上の行に関連付けます。

マスター/ディテール・ビュー・オブジェクトのユースケースと例

この章では、図6-1に示すようなビュー・オブジェクトの概念についてわかりやすく説明します。

  • ビュー・オブジェクトを1つ以上の他のビュー・オブジェクトにリンクして、任意の複雑さのマスター/ディテール階層を作成できます。

  • 実行時にマスター・ビュー・インスタンスの現在行に合せてディテール・ビュー・インスタンスが能動的に調整されるように、アプリケーション・モジュールのコンテキスト内で親子のビュー・オブジェクト・インスタンスを調整できます。

  • 設計時にビュー・リンク・アクセッサを定義できます。ビュー・リンク・アクセッサは、実行時にディテール・コレクション行セットを返すためにマスター・コレクションで使用されるアクセッサ属性を指定します。

  • マスター/ディテール関係のマスター・ビュー・オブジェクトに指定するビュー・リンク・アクセッサ属性を使用して、プログラムでディテール・コレクション行セットにアクセスできます。

  • ディテール・ビュー・インスタンスの行セットをキャッシュしてマスター/ディテール・コレクションの問合せを調整すると、ADF Facesツリー・コンポーネントのような、ツリー内の各マスター・ノードが個別にディテール行セットを保持する必要があるUIコンポーネントをサポートできます。

  • ビュー基準を使用して行検索条件を作成し、マスター・ビュー・オブジェクト内の特定の行を見つけることができます。

  • リンク元とリンク先のビュー・リンク属性が単一の表から導出されるように自己参照型のマスター/ディテール階層を定義できます。

  • インライン・ビュー基準を定義して、ディテール・ビュー・オブジェクトの属性で指定された属性値を使用してマスター・ビュー・オブジェクトの行セットをフィルタリングできます。

図6-1 問合せを定義し、行の行セットを生成するビュー・オブジェクト

図6-1の説明が続きます
「図6-1 問合せを定義し、行の行セットを生成するビュー・オブジェクト」の説明

ビュー・オブジェクトの追加機能

ビュー・オブジェクトで作業を開始する前に、その他のOracle ADF機能を理解しておくと役に立つ場合があります。次に、関連する他の機能へのリンクを示します。

マスター/ディテール階層における複数表の使用

JDeveloperを使用すると、外部キーによって関連付けられた複数の表が含まれる問合せが多数ある場合に、ソースおよびターゲットのビュー・オブジェクトをマスター/ディテール階層で作成できます。

使用する問合せは、その多くが外部キーによって関連付けられた複数の表を対象としています。このシナリオでは、関連情報を問い合せる別個のビュー・オブジェクトを作成し、ソース・ビュー・オブジェクトを1つ以上のターゲット・ビュー・オブジェクトにリンクして、マスター/ディテール階層を形成します。

この状況に対処する方法は2つあります。次のいずれかを実行できます。

  • ソース・ビュー・オブジェクトとターゲット・ビュー・オブジェクトが、基礎となるエンティティ・オブジェクトのアソシエーションに基づいている場合は、そのエンティティ・オブジェクト間のアソシエーションに基づいてビュー・リンクを作成します。

  • ソース・ビュー・オブジェクトとターゲット・ビュー・オブジェクトの関連付けを定義するビュー・リンクを作成します。

アソシエーションの有無は、エンティティ・オブジェクトがいつ作成されたかによって決まります。デフォルトでは、エンティティ・オブジェクト・アソシエーションは、データ・ソースの階層関係をモデル化しています。たとえば、外部キーで関連付けられたデータベース表に基づくエンティティ・オブジェクトは、このような関係をエンティティ・アソシエーションで取り込みます。ビュー・リンクが既存のエンティティ・アソシエーションに基づいている場合、ビュー・リンクをビュー・オブジェクトにのみ基づいて定義しても、パフォーマンス的に不利になることはありません。どちらの場合も、「ビュー・リンクの作成」ウィザードでマスター/ディテールの関係を定義します。

ノート:

1つのビュー・リンクにより、2つのビュー・オブジェクト間の基本的なマスター/ディテール関係が定義されます。ただし、より多くのビュー・リンクを作成することにより、次のものを含む複雑なマスター/ディテール階層を構成できます。

  • マルチレベルのマスター/ディテール/ディテール

  • 複数の(ピア)ディテールがあるマスター

  • 複数のマスターがあるディテール

このような複雑な階層を定義するステップは、ビュー・オブジェクトのみに基づいて関係を作成する場合も、エンティティ・アソシエーションを持つビュー・オブジェクトに基づいて関係を作成する場合も同じです。どちらの場合も、追加の各階層を、一度に1ビュー・リンクずつ作成する必要があります。

図6-2は、リンクされたマスター/ディテール問合せにより生成されたマルチレベルの結果を示しています。

図6-2 リンクされたマスター/ディテール問合せ

図6-2の説明が続きます
「図6-2 リンクされたマスター/ディテール問合せ」の説明

エンティティ・アソシエーションに基づくマスター/ディテール階層の作成方法

ユーザーにマスター行のセットを表示し、マスター行ごとに調整されたディテール行のセットを表示する必要がある場合、ビュー・リンクを作成して、マスター・ビュー・オブジェクトとディテール・ビュー・オブジェクトをどのように関連付けるかを定義できます。たとえば、部門のマスター/ディテール階層および各部門に定義された従業員セットを作成する場合は、DeptVOビュー・オブジェクトとEmpVOビュー・オブジェクトをリンクさせます。このようなビュー・オブジェクトが既存のアソシエーションによって関連付けられたエンティティを基礎としている場合は、そのアソシエーションを選択してマスター/ディテール・ビュー・リンクを定義できます。

アソシエーション・ベースのビュー・リンクを作成するには、「ビュー・リンクの作成」ウィザードを使用します。

始める前に:

マスター/ディテール階層を作成する方法に関する知識があると役立ちます。詳細は、「マスター/ディテール階層における複数表の使用」を参照してください。

エンティティ・アソシエーションの作成方法を理解しておくと役に立つ場合があります。詳細は、「既存の表からのエンティティ・オブジェクトおよびアソシエーション作成時の処理」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「ビュー・オブジェクトの追加機能」を参照してください。

次のタスクを完了する必要があります。

アソシエーション・ベースのビュー・リンクの作成方法:

  1. 「アプリケーション」ウィンドウで、ビュー・オブジェクトを作成するプロジェクトのパッケージ・ノードを右クリックし、「新規」「ビュー・リンク」の順に選択します。
  2. 「ビュー・リンクの作成」ウィザードの「名前」ページで、パッケージ名とコンポーネント名を指定します。

    たとえば、ビュー・リンクの目的を考えた場合、DeptToEmpFkLinkなどは、リンクが外部キーに基づいており、部門リストとその従業員の間のリンクであることを示しているので、名前として有効です。

  3. 「ビュー・オブジェクト」ページの「ソース属性の選択」ツリーで、目的のパッケージのソース・ビュー・オブジェクトを開きます。「関連先属性の選択」ツリーで、リンク先ビュー・オブジェクトを開きます。

    ビュー・オブジェクト属性の他にも、エンティティ・ベースのビュー・オブジェクトの場合、リストには関連するアソシエーションも表示されます。

  4. ソースのツリーおよび宛先のツリーで同じアソシエーションを選択します。その後、「追加」をクリックして、次の表にアソシエーションを追加します。

    たとえば、図6-3では、ソースのツリーおよび宛先のツリーの両方で同じSEmpDeptIdFkAssocアソシエーションが選択されています。

    図6-3 アソシエーションの選択によるマスターとディテールの関連付け

    図6-3の説明が続きます
    「図6-3 アソシエーションの選択によるマスターとディテールの関連付け」の説明
  5. 「終了」をクリックします。

ビュー・オブジェクトのみに基づくマスター/ディテール階層の作成方法

アソシエーションに基づくビュー・リンクの場合と同様に、ビュー・オブジェクトを他のビュー・オブジェクトに直接リンクし、任意の複雑さでマスター/ディテール階層を形成できます。唯一異なるのは、マスター・ビュー・オブジェクトとディテール・ビュー・オブジェクトのどちらも既存のアソシエーションによって関連付けられていない場合の作成ステップです。この場合、これらのオブジェクトを関連付ける一連のソース属性と関連先属性のペアを取得するためのアソシエーションがないため、ベースとなるビュー・オブジェクト属性を示してビュー・リンクを作成します。

ビュー・リンクを作成するには、「ビュー・リンクの作成」ウィザードを使用します。

始める前に:

マスター/ディテール階層を作成する方法に関する知識があると役立ちます。詳細は、「マスター/ディテール階層における複数表の使用」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「ビュー・オブジェクトの追加機能」を参照してください。

次のタスクを完了する必要があります。

ビュー・オブジェクト間のビュー・リンクを作成するには:

  1. 「アプリケーション」ウィンドウで、ビュー・オブジェクトを作成するプロジェクトのパッケージ・ノードを右クリックし、「新規」「ビュー・リンク」の順に選択します。
  2. 「ビュー・リンクの作成」ウィザードの「名前」ページで、パッケージ名とビュー・リンク名を入力します。「次へ」をクリックします。

    たとえば、ビュー・リンクの目的を考えた場合、OrdersPlacedByなどは、顧客リストとその注文の間のリンクであることを示しているので、名前として有効です。

  3. 「ビュー・オブジェクト」ページで、マスターとして動作するビュー・オブジェクトからソース属性を選択します。

    たとえば図6-4は、この役割を実行するCustomerVOビュー・オブジェクトから選択したId属性を示しています。「次へ」をクリックします。

  4. 「ビュー・オブジェクト」ページで、ディテールとして動作するビュー・オブジェクトから、対応するリンク先属性を選択します。

    たとえば、ディテール問合せにより、現在選択している顧客からの注文が表示されるようにする場合は、この役割を実行するOrdersVOからId属性を選択します。

  5. 「追加」をクリックし、対応する属性ペアを、下にあるソース属性とリンク先属性のペアの表に追加します。マスター/ディテール・リンクの定義が終了したら、「次へ」をクリックします。

    図6-4では、ペアが1つのみ(CustomerVO.IdOrderVO.Id)選択されています。ただし、マスターとディテールの間のリンクを定義するために必要な属性ペアが複数ある場合、「ビュー・オブジェクト」ページでこれらのステップを繰り返して、ソース/ターゲット属性ペアをさらに追加できます。

    図6-4 ビュー・リンク作成中のソース/ターゲット属性ペアの定義

    この図は周囲のテキストで説明しています
  6. 「ビュー・リンク・プロパティ」ページでは、「アクセッサ名」フィールドを使用して、リンク先ビュー・オブジェクトへのプログラムによるアクセスを可能にするアクセッサのデフォルト名を変更できます。

    デフォルトでは、アクセッサ名は、リンク先ビュー・オブジェクトの名前と一致します。たとえば、デフォルトのアクセッサ名をOrdersVO1からCustomerOrdersに変更すると、アクセッサで定義されるマスター/ディテール関係が明確になります。

  7. また、「ビュー・リンク・プロパティ」ページで、ビュー・リンクが一方向と双方向のどちらを表すのかを制御できます。

    デフォルトでは、ビュー・リンクは、ソース(マスター)の現在行をリンク先(ディテール)ビュー・オブジェクトの関連する行のセットにアクセスできるようにする一方向関係です。階層的なUIコンポーネント(たとえばマスター・ビュー・オブジェクトで生成されたアクセッサを持つビュー・リンク・アクセッサを必要とするデータバインドされたツリーなど)のサポートを有効にする場合は、「アクセッサの生成」のデフォルト設定はそのまま変更しないでください。

    たとえば、図6-5におけるチェック・ボックスの設定では、CustomerVOの現在行のOrdersVOから行のディテール・コレクションにはアクセスできますが、逆方向のアクセスはできません。この場合の動作は、OrdersVO「宛先アクセッサ」グループ・ボックスのチェック・ボックス(「アクセッサの生成」の「ビュー・オブジェクト: CustomerVO」ボックスを選択)と、CustomerVO「リンク元アクセッサ」グループ・ボックスのチェック・ボックス(「アクセッサの生成」の「ビュー・オブジェクト: OrdersVO」ボックスの選択を解除)の設定によって指定します。

    図6-5 ビュー・リンク・プロパティ・コントロール名およびアクセッサの方向

    この図は周囲のテキストで説明しています
  8. 「ソース問合せの編集」ページで、実行時にソース・ビュー・オブジェクトのマスター行へのアクセスに使用されるビュー・リンクのSQL述語をプレビューし、「次へ」をクリックします。
  9. 「関連先問合せの編集」ページで、実行時にソース・ビュー・オブジェクトの現在行に対するリンク先ビュー・オブジェクトから相関ディテール行へのアクセスに使用されるビュー・リンクのSQL述語をプレビューし、「次へ」をクリックします。
  10. 「アプリケーション・モジュール」ページで、目的のアプリケーション・モジュールのデータ・モデルにビュー・リンクを追加し、「終了」をクリックします。

    デフォルトでは、ビュー・リンクはアプリケーション・モジュールのデータ・モデルに追加されません。ビュー・リンクは、後でアプリケーション・モジュールの概要エディタを使用してデータ・モデルに追加できます。

ビュー・リンクを使用したマスター/ディテール階層の作成時の処理

ビュー・リンク、またはアソシエーションベースのビュー・リンクを作成する場合、JDeveloperでその宣言的設定を表すXMLドキュメントが作成され、そのパッケージの名前に対応するディレクトリ内に保存されます。たとえば、DeptToEmpFkLinkという名前のビュー・リンクが作成され、views.linksパッケージに表示された場合、プロジェクトのソース・パスに作成されるXMLファイルは、./views/links/DeptToEmpFkLink.xmlになります。このXMLファイルには、指定したソース属性とリンク先属性のペアに関する宣言情報が含まれ、ビュー・リンクがアソシエーションベースの場合は、指定したソース・ビュー・オブジェクトとリンク先ビュー・オブジェクトを関連付けるアソシエーションに関する宣言情報が含まれます。

ビュー・リンク・コンポーネント定義自体を保存するのみでなく、JDeveloperはビュー・リンク関係でのリンク元ビュー・オブジェクトのXML定義を更新して、定義したビュー・リンク・アクセッサに関する情報を追加します。これを確認するため、「アプリケーション」ウィンドウでソース・ビュー・オブジェクトを選択し、「構造」ウィンドウでその詳細を検証できます。図6-6に示すように、DeptVOソース・ビュー・オブジェクトのViewLink Accessorsノードの下には、リンク先のEmpVOビュー・オブジェクトにアクセスするデフォルトのリンク先アクセッサEmpVOAccessorがあります。これにより、ソース・ビュー・オブジェクトはビュー・リンク・アクセッサを使用して、ビュー・リンクのリンク先側を横断できます。ソース・ビュー・オブジェクトのビュー・リンク・アクセッサ定義に加えて、ビュー・リンクを直接カスタマイズすることにより、リンク先ビュー・オブジェクトにビュー・リンク・アクセッサを定義できます。

図6-6 「構造」ウィンドウにビュー・リンク・アクセッサが表示されるビュー・オブジェクト

この図は周囲のテキストで説明しています

データ・モデルでアクティブなマスター/ディテール調整を有効化する方法

「エンティティ・アソシエーションに基づくマスター/ディテール階層の作成方法」で説明したように、ビュー・リンクを定義して、相関ディテールの行セットにプログラムで移動できるようにする場合、ビュー・リンクは、コードから要求された際、調整されたディテール行セットの取得に必要な情報を定義するのみという受動的な役割を担います。ビュー・リンク・アクセッサ属性が存在し、ビュー・リンクのソース・ビュー・オブジェクトの任意のインスタンスから任意の結果行でプログラムによるアクセスが可能です。つまり、プログラムによるアクセスでは、アプリケーション・モジュールのデータ・モデルを変更する必要はありません。

ただし、マスター/ディテール・ユーザー・インタフェースは、エンタープライズ・アプリケーション内で頻繁に発生するため、マスター/ディテール画面をプログラムで調整する必要性をなくすために、ビュー・リンクをより能動的に使用することもできます。ビュー・リンクされたビュー・オブジェクトのインスタンスをアプリケーション・モジュールのデータ・モデルに 明示的に追加することにより、この能動的なマスター/ディテール調整を実行できます。

マスター/ディテールの調整を有効にするには、概要エディタでアプリケーション・モジュールを開き、「データ・モデル」ページを選択します。

始める前に:

マスター/ディテール階層を作成する方法に関する知識があると役立ちます。詳細は、「マスター/ディテール階層における複数表の使用」を参照してください。

アプリケーション・モジュールの役割を理解しておくと役に立つ場合があります。詳細は、「アプリケーション・モジュールについて」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「ビュー・オブジェクトの追加機能」を参照してください。

次のタスクを完了する必要があります。

ビュー・オブジェクトのディテール・インスタンスを追加するには:

  1. 「アプリケーション」ウィンドウで、新しいビュー・インスタンスを定義するアプリケーション・モジュールをダブルクリックします。
  2. 概要エディタで、「データ・モデル」ナビゲーション・タブをクリックします。
  3. 「データ・モデル」ページで、「ビュー・オブジェクト・インスタンス」セクションを展開し、 「使用可能なビュー・オブジェクト」リストで、マスター・ビュー・オブジェクトの下でインデントされたディティール・ビュー・オブジェクト・ノードを選択します。

    このリストには、ディティール・ビュー・オブジェクトが、それ自体として1回、およびビュー・リンクを介するディティール・ビュー・オブジェクトとして1回の計2回表示されることに注意してください。たとえば、図6-7では、EmpVOのラベルのビュー・オブジェクト(この場合は、強調表示されているビュー・オブジェクトの下に表示)ではなく、EmpVO via DeptToEmpFkLinkディテール・ビュー・オブジェクトを選択しています。

    図6-7 「選択可能なビュー・オブジェクト」から選択されたディテール・ビュー・オブジェクト

    この図は周囲のテキストで説明しています
  4. 「使用可能なビュー・オブジェクト」リストの下のビュー・インスタンスの名前の指定フィールドに、作成しようとしているディテール・インスタンスの名前を入力します。

    たとえば、図6-7では、ディテール・ビューであるEmpVOビュー・オブジェクトのインスタンスの名前はEmpDetailsVOです。

  5. 「データ・モデル」リストで、アクティブに調整するマスターにする必要があるビュー・オブジェクトのインスタンスを選択します。
  6. 「インスタンスの追加」をクリックして、データ・モデル内で現在選択されているマスター・インスタンスに、自分が選択した名前でディテール・インスタンスを追加します。

    たとえば、図6-8では、「データ・モデル」リストに、ビュー・オブジェクト・インスタンスのマスター/ディテール階層(ディテール・ビュー・オブジェクトはEmpDetailsVO)が表示されています。

図6-8 ビュー・リンクされたビュー・オブジェクトによるデータ・モデル

この図は周囲のテキストで説明しています

マスター/ディテールの調整のテスト方法

マスター/ディテールのアクティブな調整をテストするには、「アプリケーション」ウィンドウのポップアップ・メニューから「実行」を選択して、アプリケーション・モジュール上でOracle ADFモデル・テスターを起動します。Oracle ADFモデル・テスターのデータ・モデル・ツリーには、マスター・ビュー・オブジェクト・インスタンスでディテール・ビュー・オブジェクト・インスタンスをアクティブに調整するビュー・リンク・インスタンスが表示されます。ツリーでビュー・リンク・インスタンス・ノードをダブルクリックすると、Oracle ADFモデル・テスターのマスター/ディテール・データ・ビュー・ページが開きます。ツールバー・ボタンを使用してマスター・ビュー・オブジェクト内で移動する(結果としてビュー・オブジェクトの現在行を変更する)場合に、調整されたディテールのセットが自動的にリフレッシュされ、ユーザー・インタフェースは同期を維持します。

マスターまたはディテールとして定義されていない別のビュー・オブジェクトをダブルクリックすると、2番目のタブが開き、そのデータが表示されます。この場合、そのビュー・オブジェクトに対してはビュー・リンクによるアクティブな調整が行われないため、その問合せはマスター・ビュー・オブジェクトの現在行による制約を受けません。

データ・モデルを編集してOracle ADFモデル・テスターを実行する方法の詳細は、「Oracle ADFモデル・テスターを使用したビュー・オブジェクト・インスタンスのテスト」を参照してください。

ビュー・リンク・アクセッサを使用したディテール・コレクションのアクセス方法

ビュー・リンクを効果的に使用するためには、ビュー・リンク・アクセッサ属性によりRowSetオブジェクトが戻されることや、ディテール・コレクションへのビュー・リンク・アクセッサでのプログラムによるアクセスが可能になることを理解しておく必要があります。

名前による行の属性へのアクセス

実行時に、RowオブジェクトにあるgetAttribute()メソッドにより、ビュー・オブジェクトの名前別の結果セットで行の属性にアクセスできます。ビュー・リンク・アクセッサは、ソース・ビュー・オブジェクトの現在行の追加属性のような動作をするため、同じgetAttribute()メソッドを使用してその値を取得できます。通常のビュー属性とビュー・リンク・アクセッサ属性との実際の相違点は、そのデータ型のみです。通常のビュー属性は、一般に303ngreenbeのような値を持つスカラー・データ型であるのに対し、ビュー・リンク・アクセッサ属性の値はゼロまたは1つ以上の相関ディテール行の行セットです。curUserOrdersビュー・オブジェクトのいくつかのインスタンスからのRowオブジェクトであると仮定すると、注文項目のディテール行セットを取得するための、次のコードを1行作成することができます。

RowSet items = (RowSet)curUser.getAttribute("OrderItems");

ノート:

ビュー行のカスタムJavaクラスを生成する場合、ビュー・リンク・アクセッサのタイプはRowIteratorになります。実行時に、戻り値が必ずRowSetオブジェクトになるため、ビュー・リンク属性値をRowSetにキャストするのが安全です。

ビュー・リンク・アクセッサを使用したディテール・コレクションへのプログラムによるアクセス

次の例に示すように、ビュー・リンク・アクセッサを使用してディテール行のRowSetオブジェクトを取得すると、ビュー・オブジェクトの結果の行セットをループする場合と同じように、それが含まれる行全体をループできます。

while (items.hasNext()) {
  Row curItem = items.next();
  System.out.println("--> (" + curItem.getAttribute("LineItemId") + ") " + 
                     curItem.getAttribute("LineItemTotal"));
}

テスト・クライアントの作成の詳細は、「ビュー・リンク・アクセッサを使用したディテール・コレクションのアクセス方法」を参照してください。

マスター/ディテール・データを表示するためのビュー・リンク・アクセッサのアクセスの最適化

新しいディテール行セット作成の問合せの再実行に関連する若干のオーバーヘッドがアプリケーションで発生しないようにする場合は、ビュー・リンク・アクセッサ行セットのキャッシュを有効にできます。たとえば、マスター行ビュー・アクセッサ属性が変更されないかぎり、ビュー・アクセッサ行セットは安定した状態を維持し、ADF Facesツリー・コンポーネントのようなUIコンポーネントの行セットを再作成する必要がありませんが、ツリー内の各マスター・ノードのデータは、個別のディテール行のセットを維持する必要があります。

ビュー・リンク・アクセッサのソースであるビュー・オブジェクトについて、概要エディタを使用してビュー・リンク・アクセッサ行セットの保存を有効にできます。ソース・ビュー・オブジェクトの概要エディタの「ビュー・アクセッサ」ページで、「行セットの保存」フラグを選択します。

パフォーマンスのヒント:

ユーザー・インタフェース開発者がビュー・リンクを使用して、ディテール・コレクションが安定しているデータバインド型マスター・ディテール・コンポーネント(ADF Facesツリー・コンポーネントなど)を作成することが予想される場合は、「行セットの保存」フラグを有効にしてください。実行時に、この設定によってディテール・コレクションごとにアクセッサが1回実行されます。パフォーマンスにおけるこの改善の代償としては、フラグを有効にせずにディテール・コレクションにアクセスすることに比べて、アクセスされるコレクションではより多くのメモリー領域を占有する場合があります。

ビュー・リンク・アクセッサ行セットの保存を有効にするには:

  1. 「アプリケーション」ウィンドウで、ビュー・リンクを定義するソース・ビュー・オブジェクトをダブルクリックします。
  2. 概要エディタで、「ビュー・アクセッサ」ナビゲーション・タブをクリックします。
  3. 「ビュー・アクセッサ」ページで「ビュー・リンク・アクセッサ」セクションを開き、「行セットの保存」チェック・ボックスを選択します。

ビュー・リンク・アクセッサとデータ・モデル・ビュー・リンク・インスタンスの相違に関する必知事項

ビュー・オブジェクトは、次の2種類のスタイルのマスター/ディテール調整をサポートします。

アクティブなマスター/ディテール調整による動的ディテール行セットの有効化

ビュー・リンク・インスタンスをアプリケーション・モジュールのデータ・モデルに追加するときは、2つの特定のビュー・オブジェクト・インスタンスを接続します。ビュー・リンク・インスタンスの使用は、2つの間にアクティブなマスター/ディテール調整が必要なことを示します。実行時には、データ・モデル内のビュー・リンク・インスタンスにより、このコーディネーションを有効にするイベント処理が容易になります。マスター・ビュー・オブジェクト・インスタンスで現在行が変更されるたびに、イベントが発生し、マスター・ビュー・オブジェクトの新しい現在行に対する新しいバインド・パラメータのセットでexecuteQuery()が自動的に呼び出されることで、ディテール・ビュー・オブジェクトがリフレッシュされます。

このデータ・モデル・マスター/ディテールの重要な特徴は、マスターおよびディテール・ビュー・オブジェクト・インスタンスが、クライアントのユーザー・インタフェースがバインディングを確立できる固定のオブジェクトであることです。マスターで現在行が変化すると、新しいディテール・ビュー・オブジェクト・インスタンスが生成されるのではなく、既存のディテール・ビュー・オブジェクト・インスタンスが、マスターの新しい現在行に関連する行のセットを含むように、デフォルトの行セットを更新します。さらに、ユーザー・インタフェースのバインディング・オブジェクトはイベントを受け取り、ディテール・ビュー・オブジェクトのリフレッシュされた行セットを含むように表示を更新できます。

データ・モデル階層のみが備えるもう1つの重要な機能は、1つのディテール・ビュー・オブジェクト・インスタンスが複数のマスター・ビュー・オブジェクト・インスタンスを持つことができることです。たとえば、PaymentOptionsビュー・オブジェクト・インスタンスは、Customersビュー・オブジェクト・インスタンスとOrdersビュー・オブジェクト・インスタンスの両方のディテールになることができます。CustomersまたはOrdersのビュー・オブジェクト・インスタンスの現在行が変わるたびに、ディテールPaymentOptionsビュー・オブジェクト・インスタンスのデフォルトの行セットは、現在の顧客および現在のオーダーの支払情報の行を含むようにリフレッシュされます。複数のマスターがあるディテール・ビュー・オブジェクト・インスタンスを設定する方法の詳細は、「複数のマスターがあるマスター/ディテール階層を作成する方法」を参照してください。

ビュー・リンク・アクセッサ属性を使用したディテール行セットへのプログラムによるアクセス

ビュー・リンクによりビュー・オブジェクト行に関係するディテール行セットにプログラムでアクセスする必要がある場合は、ビュー・リンク・アクセッサ属性を使用できます。ビュー・リンク・アクセッサ属性のファインダ名は、ビュー・リンクの概要エディタから指定します。「関連」ページの「アクセッサ」セクションにある「編集」アイコンをクリックし、「ビュー・リンク・プロパティの編集」ダイアログでビュー・リンク・アクセッサ属性の名前を編集します。

次の例は、<Attr>要素の_findername値を定義するビュー・リンクのXMLを示しています。

<ViewLinkDefEnd
    Name="Orders"
    Cardinality="1"
    Owner="devguide.advanced.multiplemasters.Orders"
    Source="true">
    <AttrArray Name="Attributes">
      <Item Value="devguide.advanced.multiplemasters.Orders.PaymentOptionId"/>
    </AttrArray>
    <DesignTime>
      <Attr Name="_minCardinality" Value="1"/>
      <Attr Name="_isUpdateable" Value="true"/>
      <Attr Name="_finderName" Value="Orders"/>
    </DesignTime>
</ViewLinkDefEnd>

アクセッサ属性の名前がAccessorAttrNameであるとすると、次のような汎用getAttribute() APIを使用してディテール行セットにアクセスできます。

RowSet detail = (RowSet)currentRow.getAttribute("AccessorAttrName");

マスター・ビュー・オブジェクトに対するカスタム・ビュー行クラスを生成し、クライアント・ビュー行インタフェースでビュー・リンク・アクセッサ属性に対するgetterメソッドを公開してある場合は、次のような強く型付けされたコードを使用してディテール行セットにアクセスできます。

RowSet detail = (RowSet)currentRow.getAccessorAttrName();

データ・モデル・マスター/ディテールとは異なり、ビュー・リンク・アクセッサ属性のプログラムによるアクセスでは、アプリケーション・モジュールのデータ・モデルにディテール・ビュー・オブジェクト・インスタンスは必要ありません。ビュー・リンク・アクセッサ属性を呼び出すたびに、呼出しを行ったマスター行に関連するディテール行のセットを含むRowSetが返されます。

ビュー・リンク・アクセッサ属性を使用すると、ディテール・データ行は不変になります。マスター行のビュー・リンク定義に関係する属性値が変わらないかぎり、ディテール・データ行は変化しません。マスターの現在行が変化しても、特定のマスター行にアタッチされているディテール行セットは影響を受けません。このため、ビュー・リンク・アクセッサ属性は、ディテール行の汎用的なプログラム・アクセスに便利なだけでなく、ツリー・コントロールのようなUIオブジェクトにも適しています。ツリー・コントロールでは、ツリー内の各マスター・ノードのデータは、個別のディテール行のセットを維持する必要があります。

実行時に行われる処理: ビュー・リンク・アクセッサを使用したプログラムによるアクセスを組み合せるタイミング

Oracle ADFは、データ・モデル・マスター/ディテールとビュー・リンク・アクセッサの行セットを区別する必要があります。データ・モデル・マスター/ディテールと、ビュー・リンク・アクセッサを使用するディテール行セットのプログラムによるアクセスを組み合せるときは、これらが個別のメカニズムであることを理解することが重要です。たとえば、次のことを行うものとします。

  • PersonsVOおよびOrdersVOビュー・オブジェクトを定義します。

  • これらの間のビュー・リンクを定義し、ビュー・リンク・アクセッサにPersonsToOrdersという名前を付けます。

  • これらのインスタンスを、ビュー・リンク・インスタンスによってアクティブに調整されるmaster (PersonsVO型)およびdetail (OrdersVO型)という名前の、アプリケーション・モジュールのデータ・モデルに追加します。

masterビュー・オブジェクトのインスタンスで人物を検索すると、detailビュー・オブジェクトのインスタンスが更新され、予測どおりに対応する順序が表示されます。この時点で、現在のPersonsVO行のPersonsToOrdersビュー・リンク・アクセッサ属性にプログラムでアクセスするカスタム・メソッドを呼び出すと、OrdersVO行のセットを含むRowSetが取得されます。一般には、プログラムでアクセスされたこのRowSetはデータ・モデルのdetailビュー・オブジェクト・インスタンスに由来するものと考えられますが、そうではありません。

ビュー・リンク・アクセッサによって返されるRowSetは、常に内部的に作成されたビュー・オブジェクト・インスタンスからのものであり、ユーザーがデータ・モデルに追加したものではありません。この内部的なビュー・オブジェクト・インスタンスは、必要に応じて作成され、システムが定義する名前でルート・アプリケーション・モジュールに追加されます。

内部的に作成される個別のビュー・オブジェクト・インスタンスが使用される最大の理由は、データ・モデル内のビュー・オブジェクト・インスタンスに対して開発者が行う変更によって、インスタンスが影響を受けないようにするためです。たとえば、ビュー行が、ビュー・リンク・アクセッサのRowSetに対してデータ・モデル内のディテール・ビュー・オブジェクトを使用する場合、開発者が次のようなことを動的に行うと、結果の行セットが誤って影響を受ける可能性があります。

  1. 新しい名前付きバインド・パラメータを含むWHERE句を追加する。

    このようなビュー・オブジェクト・インスタンスがビュー・リンク・アクセッサの結果に使用されると、動的に追加されたWHERE句のバインド・パラメータ値はビュー・リンク・アクセッサのRowSetに提供されていないため、予想外の結果またはエラーが発生します。このような値が提供されるのは、データ・モデル内のディテール・ビュー・オブジェクト・インスタンスのデフォルト行セットのみです。

  2. データ・モデルのディテール・ビュー・オブジェクト・インスタンスにマスター・ビュー・オブジェクト・インスタンスを追加する。

    このシナリオでは、アクセッサのセマンティクスが変更されます。アクセッサが現在のPersonsVO行に対するOrdersVO行を返すかわりに、たとえば現在ログインしている顧客によって作成された現在のPersonsVOに対するOrdersVOのみを突然返し始めます。

  3. ディテール・ビュー・オブジェクト・インスタンスまたはそれを含むアプリケーション・モジュール・インスタンスを削除する。

    このシナリオでは、プログラムでアクセスされたディテールRowSetのすべての行が無効になります。

さらに、Oracle ADFは、特定の操作について、データ・モデル・マスター/ディテールとビュー・リンク・アクセッサの行セットを区別する必要があります。たとえば、ディテール・ビュー・オブジェクトで新しい行を作成すると、フレームワークは、ビュー・リンクに含まれる属性に、マスターの対応する値を自動的に移入します。データ・モデル・マスター/ディテールの場合は、このような値を、データ・モデルの場合によっては複数のマスター・ビュー・オブジェクト・インスタンスの現在行から取得します。ビュー・リンク・アクセッサによって返されるRowSetに新しい行を作成する場合は、アクセッサが呼び出されたマスター行からの値を移入します。

複数のマスターがあるマスター/ディテール階層を作成する方法

役に立つ場合には、同じディテール・ビュー・オブジェクトのインスタンスに対して複数のマスター・ビュー・オブジェクトのインスタンスが存在するように、データ・モデルを設定できます。CustomersOrders、およびPaymentOptionsという名前のビュー・オブジェクトと、次のように定義されたビュー・リンクについて考えます。

  • CustomersPaymentOptions

  • OrdersPaymentOptions

図6-9は、CustomersOrdersの両方のビュー・オブジェクト・インスタンスが、同じPaymentOptionsビュー・オブジェクト・インスタンスのマスターになるように構成した場合の、データ・モデル・パネルの表示を示しています。

図6-9 同じディテールに対する複数のマスター・ビュー・オブジェクト・インスタンス

図6-9の説明が続きます
「図6-9 同じディテールに対する複数のマスター・ビュー・オブジェクト・インスタンス」の説明

図6-9のようなデータ・モデルを設定するには、アプリケーション・モジュールの概要エディタで、「データ・モデル」ページを使用します。

始める前に:

ビュー・オブジェクトに関する知識が役立つ場合があります。詳細は、「ビュー・オブジェクトについて」を参照してください。

複数のマスター・ビュー・オブジェクトを持つビュー・インスタンスを作成するには:

  1. 最初のマスター・ビュー・オブジェクトのインスタンスをデータ・モデルに追加します。

    名前はCustomersとします。

  2. 2番目のマスター・ビュー・オブジェクトのインスタンスをデータ・モデルに追加します。

    名前はOrdersとします。

  3. 「データ・モデル」リストから、最初のマスター・ビュー・オブジェクトのインスタンスを選択します。
  4. 「使用可能なビュー・オブジェクト」リストで、最初のマスター・ビュー・オブジェクトの下にインデントされているディテール・ビュー・オブジェクトを選択し、「新規インスタンス名」フィールドにビュー・オブジェクト・インスタンスの名前を入力します。次に、>をクリックして、既存のCustomersビュー・オブジェクト・インスタンスのディテールとしてデータ・モデルに移動します。
  5. 「データ・モデル」リストから、2番目のマスター・ビュー・オブジェクトのインスタンスを選択します。
  6. 「使用可能なビュー・オブジェクト」リストで、2番目のマスター・ビュー・オブジェクトの下にインデントされているディテール・ビュー・オブジェクトを選択し、「新規インスタンス名」フィールドに、直前に入力したディテール・ビュー・オブジェクトの場合と同じビュー・オブジェクト・インスタンス名を入力します。次に、>をクリックして、既存のOrdersビュー・オブジェクト・インスタンスのディテールとしてデータ・モデルに移動します。

    次の警告が表示されます: PaymentOptionsVOという名前のビュー・オブジェクトのインスタンスはデータ・モデルですでに使用されています。同じインスタンスを使用しますか。

  7. 「はい」をクリックして、このディテール・ビュー・オブジェクト・インスタンスを、2番目のビュー・オブジェクト・インスタンスのディテールにもすることを確認します。

エンティティ・オブジェクト用に一時のみ属性によるマスター/ディテール階層を作成する方法

エンティティ・ベースのビュー・オブジェクトをリンクしてマスター/ディテール階層を形成すると通常、ビュー・オブジェクトとこれらの各慣用名がアソシエーションによって関連付けられます。実行時に、アソシエーションにより内部アソシエーション・ビュー・オブジェクトが作成され、これによって問合せの実行が有効になり、マスター/ディテール調整が有効にされます。アソシエーションに参加するエンティティ・オブジェクトが非永続属性のみで構成される場合は、このシナリオに例外が発生します。実行時にプログラムで移入する一時属性でエンティティ・オブジェクトを定義すると、これが発生する場合があります。この場合、非永続エンティティ・オブジェクトにリンクするアソシエーション概要エディタを使用して、アソシエーション・ビュー・オブジェクトを選択し、問合せを実行できます。

始める前に:

アソシエーションの知識があると役立ちます。詳細は、「既存の表からのエンティティ・オブジェクトおよびアソシエーション作成時の処理」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「ビュー・オブジェクトの追加機能」を参照してください。

次のタスクを完了する必要があります。

非永続エンティティ・オブジェクトのアソシエーションをカスタマイズするには:

  1. 「アプリケーション」ウィンドウで、カスタマイズするアソシエーションをダブルクリックします。
  2. 概要エディタで「チューニング」ナビゲーション・タブをクリックし、「カスタム・ビュー・オブジェクト」セクションの「アクセッサの編集」アイコンをクリックします。
  3. 「カスタム・ビュー」ダイアログで、非永続エンティティ・オブジェクトの「カスタム・ビュー・オブジェクトの使用」を選択します。
  4. 「ビュー・オブジェクトの選択」リストで、非永続エンティティ・オブジェクトに基づいて作成したビュー・オブジェクトを選択します。
  5. 「OK」をクリックします。

行検索を使用したマスター・ビュー・オブジェクトの行の検索方法

行検索は、ビュー基準を使用して行セットの中の特定の行を見つけるためにアプリケーションで使用されるオブジェクトです。マスター行セットに対して行検索を起動して、ディテール行セットにより提供された1つ以上の一致する基準属性を特定できます。

現在は、実行時に行キー以外の属性の参照が必要な場合に、次のマスター/ディテール・シナリオで、設計時に定義した行検索を参加させることができます。

  • ADFビジネス・コンポーネントWebサービスで行検索を公開する場合。エンド・ユーザーは、マスター・サービス・ビュー・インスタンスの特定の行(行検索にマップされた、ディテール・サービス・ビュー・インスタンスの1つ以上の属性値に一致する)に対して行更新を開始できます。このユースケースの詳細は、「ビュー基準と行検索の使用方法に関する必知事項」を参照してください。

  • 行検索にマップされた、ディテール・ビュー・インスタンスの1つ以上の非キー属性値に一致するマスター・ビューの行セットを、アプリケーションでプログラムにより取得する場合。このユースケースの詳細は、「プログラムによる行検索の呼出し」を参照してください。

ノート:

ビュー・オブジェクトで定義する行検索は、現在のところADFビジネス・コンポーネント・データ・コントロールのビュー・プロジェクト用にはサポートされていません。したがって、アプリケーションによって「データ・コントロール」パネルでコレクションとして公開されるビュー・オブジェクトの行検索マップ属性は、行検索の参照操作に関与しません。

ビュー基準により定義されるビュー基準属性は、必ずしも行のキー属性である必要はなく、ディテール・ビュー・オブジェクトで定義された任意の属性でかまいません。たとえば、PersonVOがマスター・ビュー・オブジェクト、AddressVOがディテール・ビュー・オブジェクトであるマスター/ディテール関係で、属性EmailAddressにより、AddressVOの行セット内で個人の電子メール・アドレスが一致する個人行が特定されるとします。

ディテール・ビュー・オブジェクトから提供される基準属性を使用してマスター・ビュー・オブジェクトの行を特定する行検索を作成するには、次のステップを実行します。

  1. マスター・ビュー・オブジェクトに、ディテール・ビュー・オブジェクトを参照するためのインライン・ビュー基準を定義し、バインド変数で定義されたビュー基準アイテムとして基準属性を指定します。

  2. マスター・ビュー・オブジェクトに、各基準属性の値を受け取る更新可能な一時属性を定義します。実行時に、一時属性をプログラムで設定するかWebサービス・ペイロードで公開して、エンド・ユーザーが基準属性値(電子メール・アドレスなど)を入力できるようにすることができます。

  3. ビュー基準を選択し、各基準属性のバインド変数をマスター・ビュー・オブジェクトの対応する一時属性に設定して、マスター・ビュー・オブジェクトに行検索を定義します。

マスター・ビュー・オブジェクトに対する行検索の定義

マスター・ビュー・オブジェクトの行セットをフィルタリングするために定義する行検索は、全体がマスター・ビュー・オブジェクトで定義されます。行検索では、インライン・ビュー基準内に指定された基準属性と実行時に取得された値が照合されます。基準属性値を受け取るために、マスター・ビュー・オブジェクトでは一時属性を定義できます。この一時属性は、アプリケーションがビュー・オブジェクトに対して行検索メソッドを使用してプログラムで設定するか、Webサービス・ペイロードが公開して、ユーザーにより提供された値を受け取ることができます。

行検索を定義するには、マスター・ビュー・オブジェクトの概要エディタの「行検索」ページを使用します。エディタで、選択したビュー基準の各バインド変数の値のソースを定義します。ビュー・オブジェクトの属性と、属性と値の式は、どちらも行検索によって定義されたバインド変数のソースとして有効です。

図6-10の概要エディタには、ビュー基準findPersonByEmailで指定されたビュー基準のバインド変数EmailBindVarを、マスター・ビュー・オブジェクトPersonVOによって定義された一時属性TrEmailAddress(値のソース)にマップする行検索が表示されています。

図6-10 行検索を表示したビュー・オブジェクトの概要エディタ

図6-10の説明が続きます
「図6-10 行検索を表示したビュー・オブジェクトの概要エディタ」の説明

ノート:

また、「行検索の使用」で説明しているように、行検索はマスター/ディテール階層に参加していないビュー・オブジェクトに対しても定義できます。

始める前に:

マスター/ディテール・ビュー・オブジェクトの行検索に関する知識が役立つ場合があります。詳細は、「行検索を使用したマスター・ビュー・オブジェクトの行の検索方法」を参照してください。

マスター/ディテール・ビュー・オブジェクトに関する知識が役立つ場合があります。詳細は、「マスター/ディテール・ビュー・オブジェクトについて」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「ビュー・オブジェクトの追加機能」を参照してください。

次のタスクを完了する必要があります。

マスター・ビュー・オブジェクトの行検索を作成するには:

  1. 「アプリケーション」ウィンドウで、新しい行検索でカスタマイズするマスター・ビュー・オブジェクトをダブルクリックします。
  2. 概要エディタで、「行検索」ナビゲーション・タブをクリックし、「行検索の追加」ボタンをクリックします。
  3. 「名前」フィールドで、行検索の名前を変更します。

    たとえば、電子メール・アドレスから個人のレコードを特定する目的で定義する行検索であれば、PersonByEmailFinderなどの名前です。

  4. 「行検索」リストで新しい行検索を選択し、「ビュー基準」ドロップダウンで、ビュー・オブジェクトの行セットをフィルタリングする行基準を選択します。

    図6-10のように、目的の行検索が強調表示されます。行検索で使用するビュー基準を作成していない場合、ビュー基準のリストは空になります。

  5. ADFビジネス・コンポーネントWebサービスのエンド・ユーザーが値を指定するようにする場合は、「属性」を選択したままにしてリストからバインド変数を選択し、「属性」ドロップダウンで、実行時にバインド変数の値を提供するマスター・ビュー・オブジェクトの一時属性を選択します。

    ここで選択する一時属性は、行検索が基準の属性値を指定するために使用されます。たとえば、AddressVOの電子メール・アドレスに基づいて行を照合するマスター・ビュー・オブジェクトPersonVOには、TrEmailAddressという名前で定義した一時属性が含まれている可能性があります。

    ノート: ビュー・オブジェクトの概要エディタで一時属性を作成する際には、基準参照値を受け取れるようにするために、その一時属性を「更新可能」として定義してください。

  6. 行検索で一致が許可される行数を指定する場合は、「すべてをフェッチ」の選択を解除します。

    「フェッチ制限」に行数を入力した場合は、さらに「制限超過エラー」を選択することで、「フェッチ制限」で指定された数を超えた一致行がデータベースに存在する場合に、Oracle ADFで例外をスローできるようになります。

マスター・ビュー・オブジェクトの行検索作成時の処理

マスター・ビュー・オブジェクトの行検索を作成する場合は、行検索自体の定義も含めて、行検索で必要とされるすべてのメタデータをビュー・オブジェクト定義に含めます。次の例に示すように、行検索PersonByEmailFinderのメタデータとして、ビュー・オブジェクト定義には、<Variable>要素にバインド変数EmailBindVar<ViewAttribute>要素に一時属性TrEmailAddress<ViewCriteria>要素にビュー基準findPersonByEmailおよびインライン・ビュー基準AddressVONestedCriteriaがあり、最後に<RowFinders>要素に行検索PersonByEmailFinderが含まれています。

行検索の<VarAttributeMapping>サブ要素は、ビュー基準のバインド変数EmailBindVarをマスター・ビュー・オブジェクトの一時属性TrEmailAddressにマップしています。これにより、エンド・ユーザーが実行時に値を指定し、アプリケーションで必要な基準属性を使用して行検索を起動できるようになっています。インラインの<ViewCriteriaItem>サブ要素は、ディテール・ビュー・オブジェクトの基準属性EmailAddressを、バインド変数の値に設定しています。

実行時にマスター・ビュー・オブジェクトで行検索が起動されると、1つ以上のディテール基準属性により、マスター行セットから一致する行が特定されます。この例では、電子メール・アドレスを使用して、その電子メール・アドレスが属している個人が照合されています。行検索では、行のキー値を渡さなくても個人のレコードが特定されます。

<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>

再帰的なマスター/ディテール階層における単一表の使用

JDeveloperでは、ソースおよびターゲットの属性が1つの表に存在する場合、単一のビュー・オブジェクトに基づいてマスター/ディテール階層を作成できます。

再帰的なデータ・モデルは、単一の表に基づくマスター/ディテール関係の関連元属性と関連先属性の名前を指定する単一の問合せを活用するものです。通常のマスター/ディテール関係では、関連元属性はマスター・ビュー・オブジェクトの主キー属性によって指定され、関連先属性はディテール・ビュー・オブジェクトの外部キー属性によって指定されます。たとえば、一般的なマスター/ディテール関係では、DEPARTMENT表のDepartmentId属性と、対応するEMPLOYEE表のDepartmentId属性が関連付けられます。しかし、再帰的モデルでは、関連元属性EmployeeIdと関連先属性ManagerIdがともにEMPLOYEE表に存在します。したがって、この関係に対する問合せで使用するのは、単一のビュー・オブジェクトのみです。このシナリオでは、両方の属性を指定する単一のベース・エンティティ・オブジェクトのビュー・オブジェクトを作成してから、自己参照型のビュー・リンクを定義し、このビュー・オブジェクトを「関連元」ビュー・オブジェクトおよび「関連先」ビュー・オブジェクト両方として構成してマスター/ディテール階層を形成します。

ビュー・リンクを作成したら、2つの方法でデータ・モデル・プロジェクトの再帰的マスター/ディテール階層を操作できます。次のいずれかを実行できます。

  • 同一のビュー・オブジェクトの2つのインスタンス(ビュー・リンク・インスタンスによって能動的に調整され、マスターとしての役割を果たすものと、ディテールとしての役割を果たすもの)を公開するデータ・モデルを作成します。これは、2つの別々の表で同時に単一レベルのマスター行とディテール行を表示する必要があるときに有益です。

  • ビュー・オブジェクトの単一のインスタンスのみを公開するデータ・モデルを作成し、各行のビュー・リンク・アクセッサ属性を使用してディテール行セットにアクセスします。再帰的マスター/ディテール階層のデータが存在する任意のレベルを表示(またはプログラム的に操作)できるため、2つのうち、この方法が一般的に使用されます。たとえば、treeまたはtreeTableコンポーネントの再帰的階層を表示する場合は、「ツリーでのマスター/ディテール・オブジェクトの表示方法」で説明されているように、このアプローチを使用します。

エンティティ・ベースのビュー・オブジェクトに対する再帰的マスター/ディテール階層の作成方法

再帰的マスター/ディテール階層では、ビュー・リンクで選択するリンク元およびリンク先のビュー・オブジェクトの属性は、通常、基礎となるエンティティ・オブジェクト間の自己参照型アソシエーションを定義する属性ペアと同じになります(このアソシエーションが存在する場合)。基礎をなすこのアソシエーションはビュー・リンクの作成には不要ですが、これによりビュー・リンクの作成が容易になるため、まず、ビュー・オブジェクトのベース・エンティティ・オブジェクトに対する外部キーを作成します。

再帰的マスター/ディテール階層を作成するには:

  1. ビュー・オブジェクトのベース・エンティティ・オブジェクトを使用して、自己参照型ビュー・リンクを作成します。

  2. 階層の「ルート」に表示する行のみを含めるようにビュー・インスタンスの結果をフィルタリングするビュー基準を持ったビュー・オブジェクトを公開します。

アソシエーション・ベースの自己参照型ビュー・リンクの作成

アソシエーションを作成するには、「アソシエーションの作成」ウィザードを使用します。「ビュー・リンクの作成」ウィザードを使用するときに、このアソシエーションが選択肢として表示されます。関連元ビュー・オブジェクトと関連先ビュー・オブジェクトに対して選択するアソシエーションでは、単一のデータベース表から導出された同じエンティティ・オブジェクトの名前を指定するため、このビュー・リンクは自己参照型になります。

始める前に:

再帰的なデータ・モデルに関する知識が役立つ場合があります。詳細は、「再帰的なマスター/ディテール階層における単一表の使用」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「ビュー・オブジェクトの追加機能」を参照してください。

次のタスクを完了する必要があります。

  • ビュー・リンクを作成する場合、エンティティ・オブジェクトの関連元属性と関連先属性間のアソシエーションは推測されません。再帰的階層をサポートするために、「アソシエーションの作成」ウィザードを使用して、関連元属性と関連先属性間のアソシエーションを作成できます。「エンティティ・オブジェクト」ページで、同一のエンティティ・オブジェクトを選択して関連元属性と関連先属性を指定し、ウィザードの他のすべてのデフォルト設定をそのままにします。アソシエーションの作成の詳細は、「アソシエーションの作成と構成」を参照してください。

    たとえば、再帰的マスター/ディテール階層に、管理階層に基づく従業員のリストを表示するとします。このシナリオでは、Employeesエンティティ・オブジェクトに基づいてアソシエーションを作成します。「アソシエーションの作成」ウィザードの「エンティティ・オブジェクト」ページで、関連元属性としてEmployees.EmployeeIdを、関連先属性としてEmployee.ManagerIdを選択します。エンティティ・オブジェクトEmployeesによって両方の属性が指定されるため、このアソシエーションは自己参照型になります。

アソシエーション・ベースの自己参照型ビュー・リンクを作成するには:

  1. 「アプリケーション」ウィンドウで、ビュー・オブジェクトを作成するプロジェクトを右クリックし、「新規」を選択します。

    「ビュー・リンクの作成」ウィザードでパッケージ名の入力を省略するには、「アプリケーション」ウィンドウで、linksパッケージ・ノードのポップアップ・メニューから「新規」「ビュー・リンク」の順に選択します。

  2. 「新規ギャラリ」で、「ビジネス層」を展開し、「ADFビジネス・コンポーネント」を選択してから、「ビュー・リンク」を選択し、「OK」をクリックします。
  3. 「ビュー・リンクの作成」ウィザードの「名前」ページで、パッケージ名とコンポーネント名を指定します。
  4. 「ビュー・オブジェクト」ページの「ソース属性の選択」ツリーで、目的のパッケージのソース・ビュー・オブジェクトを開きます。「関連先属性の選択」ツリーで、リンク先ビュー・オブジェクトを開きます。

    ビュー・オブジェクト属性の他にも、エンティティ・ベースのビュー・オブジェクトの場合、リストには関連するアソシエーションも表示されます。

  5. ソースのツリーおよび宛先のツリーで同じアソシエーションを選択します。その後、「追加」をクリックして、次の表にアソシエーションを追加します。

    たとえば、図6-11では、関連元のツリーおよび関連先のツリーの両方で同じEmpManagersFkAssocアソシエーションが選択されています。アソシエーションの定義で、同じエンティティ・オブジェクト(この場合はEmployees)上で関連元属性と関連先属性が指定されているため、このビュー・リンクは自己参照型です。

    図6-11 自己参照型アソシエーションの選択によるマスターとディテールの関連付け

    図6-11の説明が続きます
    「図6-11 自己参照型アソシエーションの選択によるマスターとディテールの関連付け」の説明
  6. 「ビュー・リンク・プロパティ」ページで、デフォルトの選択をそのままにしますが、関連先アクセッサのアクセッサ名を意味のわかりやすい名前に変更します。

    たとえば、図6-12では、関連先アクセッサ名はEmployeesViewからStaffListに変更されています。この名前は、ユーザー・インタフェース開発者がこのアクセッサを選択してADF Facesツリー・コンポーネントを移入するときにバインディング・エディタで公開されます。ここで指定する名前により、UI開発者はこのアクセッサの目的(このケースでは、各管理者に関連付けられた従業員リストの生成)を理解します。

    図6-12 ビュー・リンクの名前が変更された関連先アクセッサ

    図6-12の説明が続きます
    「図6-12 ビュー・リンクの名前が変更された関連先アクセッサ」の説明
  7. 「終了」をクリックします。
ビュー・インスタンスの公開とビュー基準によるフィルタ

プロジェクトのデータ・モデルのビュー・オブジェクトを公開する準備ができたら、ビュー基準を使用してツリーのルートの最初の値をフィルタリングするように、データ・モデルのビュー・インスタンスを構成します。たとえば、再帰的マスター/ディテール階層に、管理階層に基づく従業員のリストを表示するとします。このシナリオでは、階層全体のルート値にする従業員の従業員IDを指定するように、ビュー基準のバインド変数を構成します。この場合、管理者と従業員の再帰的階層のルート値は、組織で最高レベルの管理者の従業員IDにします。

始める前に:

再帰的なデータ・モデルに関する知識が役立つ場合があります。詳細は、「再帰的なマスター/ディテール階層における単一表の使用」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「ビュー・オブジェクトの追加機能」を参照してください。

次のタスクを完了する必要があります。

  • エンティティ・ベースのビュー・オブジェクトを作成し、階層の「ルート」に表示する行のみを含めるようにビュー・インスタンスの結果をフィルタリングするビュー基準を作成します。バインド変数を使用してビュー・オブジェクトをフィルタリングするビュー基準の作成の詳細は、「名前付きビュー基準の処理」を参照してください。

    たとえば、管理者と従業員の再帰的階層で、エンティティ・ベースのビュー・オブジェクトEmployeesViewを作成します。「アソシエーションの作成」ウィザードでビュー・オブジェクトを作成したら、概要エディタの「問合せ」ページで、階層の最上部に表示する従業員を特定するバインド変数とビュー基準を作成します。階層のルートに表示する従業員を1人にする必要がある場合、このシナリオのビュー基準では、従業員ID(関連元属性に対応)のバインド変数を使用してフィルタリングすると、「ビュー基準の作成」ダイアログに表示されるWHERE句は、((Employees.EMPLOYEE_ID = :TheEmployeeId ))のようになります(TheEmployeeIdはバインド変数名)。バインド変数を使用してビュー・オブジェクトをフィルタリングするビュー基準作成の詳細は、「カスケード・リストを制御するデータソース・ビュー・オブジェクトの作成」を参照してください。

既存のアプリケーション・モジュールにビュー・オブジェクト・インスタンスを定義するには:

  1. 「アプリケーション」ウィンドウで、新しいビュー・インスタンスを定義するアプリケーション・モジュールをダブルクリックします。
  2. 概要エディタで、「データ・モデル」ナビゲーション・タブをクリックします。
  3. 「データ・モデル」ページで、「ビュー・オブジェクト・インスタンス」セクションを展開し、「使用可能なビュー・オブジェクト」リストで、フィルタリング対象のビュー基準を定義したビュー・オブジェクト定義を選択します。

    リストの下の「新規ビュー・インスタンス」フィールドに、データ・モデルに追加するビュー・オブジェクトの次のインスタンスを識別する際に使用される名前が示されます。

  4. ビュー・オブジェクトを追加する前に名前を変更するには、「新規ビュー・インスタンス」フィールドに別の名前を入力します。
  5. 目的のビュー・オブジェクトを選択し、「データ・モデル」リストに移動します。

    図6-13では、ビュー・オブジェクトEmployeesViewの名前をEmployeesに変更してから、「データ・モデル」リストに移動しています。

    図6-13 データ・モデルへのビュー・オブジェクト・インスタンスの追加

    図6-13の説明が続きます
    「図6-13 データ・モデルへのビュー・オブジェクト・インスタンスの追加」の説明
  6. ビュー・オブジェクト・インスタンスをフィルタリングして階層のルート値を指定するには、追加したビュー・オブジェクト・インスタンスを選択し、「編集」をクリックします。
  7. 「ビュー・インスタンスの編集」ダイアログで、作成したビュー基準を「選択されたもの」リストに移動し、階層のルートに対応するバインド・パラメータ値を入力します。

    図6-14は、ビュー・オブジェクトのByEmployeeIdビュー基準と、階層の最高レベルの従業員に対応する値100に設定されているバインド・パラメータTheEmployeeIdを示しています。

    図6-14 ビュー基準によるビュー・インスタンスのフィルタ

    図6-14の説明が続きます
    「図6-14 ビュー基準によるビュー・インスタンスのフィルタ」の説明
  8. 「OK」をクリックします。

再帰的マスター/ディテール階層の作成時の処理

自己参照型ビュー・リンクを作成する場合、JDeveloperでその宣言的設定を表すXMLドキュメント・ファイルが作成され、そのパッケージの名前に対応するディレクトリ内に保存されます。このXMLファイルには、選択したアソシエーションで指定した関連元属性と関連先属性のペアに関する宣言情報と、選択した関連元および関連先ビュー・オブジェクトを関連付けるアソシエーションに関する宣言情報が含まれます。

次の例では、EmpManagerFkLinkのXMLドキュメント・ファイルで、関連元と関連先に同じビュー・オブジェクトEmployeesViewを定義しています。

<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-15に示すように、EmpManagerFkLinkビュー・リンクのEmployeesViewビュー・オブジェクトに定義されたアクセッサは、「ビュー・リンク・アクセッサ」ノードに表示されています。

図6-15 「構造」ウィンドウにビュー・リンク・アクセッサが表示されるビュー・オブジェクト

図6-15の説明が続きます
「図6-15 「構造」ウィンドウにビュー・リンク・アクセッサが表示されるビュー・オブジェクト」の説明

ビュー基準でのマスター/ディテール関連ビュー・オブジェクトの使用

ADFビジネス・コンポーネントのフレームワークでは、ディテール・ビュー・オブジェクトの属性を使用してビュー基準フィルタをマスター・ビュー・オブジェクトに適用できます。

ビュー基準を使用すると、ビュー・オブジェクト自体の問合せに適用されるビュー・オブジェクト問合せフィルタを宣言的な方法で定義できます。ディテール・ビュー・オブジェクトの属性を使用してマスター・ビュー・オブジェクトをフィルタリングしなければならない場合があります。マスター・ビュー・オブジェクトとディテール・ビュー・オブジェクトが関係するビュー基準は、EXISTS演算子と、問合せフィルタを定義するためのインライン・ビュー基準に依存しています。EXISTS演算子により、インライン・ビュー基準はディテール・ビュー・オブジェクトを参照し、基準アイテムとして選択された属性を適用できます。たとえば、ビュー基準を行検索と組み合せて使用すると、マスター行セットをフィルタリングし、ディテール・ビュー・オブジェクトの基準アイテムを使用して行セットの特定の行を見つけることができます。

マスター・ビュー・オブジェクトにビュー基準を定義する場合は、そのビュー・オブジェクトの概要エディタの「ビュー基準」ページを使用します。たとえば、ディテールAddressVOEmailAddress属性を使用してマスターPersonVOの行をフィルタリングするビュー基準findPersonByEmailは、次の例のようになります。この例では、ディテール・ビュー・オブジェクトAddressVOの電子メール属性の値を実行時に取得するために、ビュー基準の文にバインド変数EmailBindVarが使用されています。

( (EXISTS(SELECT 1 FROM ADDRESS AddressEONQ1 WHERE
    (UPPER(AddressEONQ1.EMAIL_ADDRESS LIKE UPPER (:EmailBindVar || '%') ) )
         AND
      (PersonEO.PERSON_ID = AddressEONQ1.PERSON_ID) ) ) )

始める前に:

マスター・ビュー・オブジェクトに作用する行検索に関する知識が役立つ場合があります。「行検索を使用したマスター・ビュー・オブジェクトの行の検索方法」を参照してください。

ビュー基準に関する知識が役立つ場合があります。「名前付きビュー基準の処理」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。「ビュー・オブジェクトの追加機能」を参照してください。

次のタスクを完了する必要があります。

インライン・ビュー基準を作成するには:

  1. 「アプリケーション」ウィンドウで、新しいインライン・ビュー基準でカスタマイズするマスター・ビュー・オブジェクトをダブルクリックします。

    インライン・ビュー基準の作成先のビュー・オブジェクトは、マスター/ディテール階層のマスター・ビュー・オブジェクトである必要があります。

  2. 概要エディタで、「ビュー基準」ナビゲーション・タブをクリックし、「新規ビュー基準の作成」ボタンをクリックします。
  3. 「ビュー基準の作成」ダイアログで、ビュー基準の名前を入力し、アプリケーション内での用途を識別できるようにします。

    たとえば、個人の行セットを従業員の電子メールでフィルタリングするには、findPersonByEmailのようなビュー基準名を指定します。

  4. 「問合せ実行モード」ドロップダウン・リストで、デフォルトの「データベース」を選択したままにします。

    デフォルト・モードでは、ビュー・オブジェクトの問合せで指定されたデータベース表をビュー基準でフィルタリングできます。

  5. 「基準の定義」タブで、「アイテムの追加」をクリックして、ビュー基準を定義します。
  6. ビュー基準階層で、「グループ」の下にある割り当てられていないビュー基準アイテム・ノードを選択し、「基準アイテム」セクションで「属性」ドロップダウンを選択して、リストからディテール・ビュー・オブジェクトを選択します。

    現在編集中のビュー・オブジェクトにビュー・リンクが存在している場合は、ディテール・ビュー・オブジェクトを選択して、インラインにネストされたビュー基準を持つビュー基準を作成できます。ディテール・ビュー・オブジェクトの名前が「属性」ドロップダウン・リストに表示されます。たとえば、図6-16に示すように、PersonVOAddressVOにリンクされ、findPersonByEmailのビュー基準定義により、ディテール・ビュー・オブジェクトAddressVOの属性でマスター・ビュー・オブジェクトPersonVOがフィルタリングされます。

    図6-16 インライン・ビュー基準を指定した「ビュー基準の編集」ダイアログ

    図6-16の説明が続きます
    「図6-16 インライン・ビュー基準を指定した「ビュー基準の編集」ダイアログ」の説明
  7. 「演算子」「オペランド」のデフォルトの選択肢は変更しないでおきます。

    ビュー・オブジェクトの基準アイテムを含むインライン・ビュー基準を作成する場合は、デフォルトの選択肢として、エディタに演算子「存在する」とオペランド「インライン・ビュー基準」が指定されます。「ビュー基準でのマスター/ディテール関連ビュー・オブジェクトの使用」で説明しているように、実行時、EXISTS演算子はディテール・ビュー・オブジェクトに属性値が存在するかどうかをテストし、マスター・ビュー・オブジェクトの行をフィルタ処理します。

  8. ビュー基準階層で、「グループ」の下にある新しいビュー基準アイテム・ノードを選択し、「基準アイテム」セクションで次のように入力します。
    • 「属性」ドロップダウンで、フィルタ基準とするディテール・ビュー・オブジェクトの属性を選択します。

      ディテールの属性は、マスター・ビュー・オブジェクトをフィルタリングするために使用される属性です。基準アイテムにバインド変数が定義されている場合は、この属性の値をエンド・ユーザーが指定できます。

    • 「演算子」ドロップダウンで、必要なフィルタ演算子を選択します。

    • 「オペランド」ドロップダウンで、「バインド変数」を選択し、ディテールの属性のバインド変数名を指定します。ビュー基準にすでに変数が定義されている場合は、「パラメータ」ドロップダウン・リストから選択します。そうでない場合は、「新規」をクリックして「新規変数」ダイアログを表示し、そこでビュー基準に対する新しいバインド変数の名前を指定します。

      ノート: ビュー基準で使用する既存のバインド変数をドロップダウン・リストから選択する場合は、ビュー・オブジェクトの問合せ用に定義されたバインド変数を選択しないでください(これらは概要エディタの「問合せ」ページに表示されます)。概要エディタの「ビュー基準」ページで定義したバインド変数のみを選択してください。

  9. 実行時に指定される値が大文字か小文字かに基づいた、大/小文字を区別した属性のフィルタリングを無効にする場合は、「大/小文字を区別しない」が選択された状態のままにします。

    このオプションは、String型の属性に対してのみサポートされています。デフォルトでは、大/小文字の区別のある検索は使用できません。

  10. 「検証」ドロップダウン・リストでは、デフォルトである「オプション」を選択したままにします。

    「オプション」を選択すると、値がNULLでない場合にのみビュー基準(または検索フィールド)がWHERE句に追加されます。新規の各ビュー基準アイテムに対してデフォルトの「オプション」を選択すると、NULL値に対しても例外は生成されません。たとえば、図6-17は、findPersonByEmailビュー基準定義により、ディテール・ビュー・オブジェクトAddressVOEmail属性でマスター・ビュー・オブジェクトPersonVOがフィルタリングされ、値がNULLでも許可されることを示しています。

    図6-17 バインド変数の基準アイテムを指定した「ビュー基準の編集」ダイアログ

    図6-17の説明が続きます
    「図6-17 バインド変数の基準アイテムを指定した「ビュー基準の編集」ダイアログ」の説明
  11. 「OK」をクリックします。
  12. 概要エディタの「ビュー基準」ページでバインド変数を選択し、「詳細」セクションのデフォルトの設定は、次のように、変更しないでおきます。
    • 「リテラル」は選択したままにしますが、デフォルト値は指定しないでください。値は実行時にエンド・ユーザーから取得されます。

    • 「更新可能」を選択したままにして、バインド変数の値がユーザー・インタフェースから定義されるようにします。

  13. 「ビュー基準」ページで「UIヒント」タブをクリックし、「ラベル」「フォーマットの種類」「フォーマット」マスクなどのヒントを指定します。

    名前付きバインド変数の値を入力できる検索ページなどのユーザー・インタフェースを作成する場合、ビュー・レイヤーではバインド変数のUIヒントが使用されます。フォーマットは、Date型または任意の数値データ型で定義されたバインド変数でのみサポートされることに注意してください。