アソシエーションの拡張

JDeveloperには、拡張アソシエーションの機能が用意されています。この機能を利用して、拡張エンティティ・オブジェクト間のアソシエーション関係を保持できます。また、アソシエーションを拡張することにより、拡張エンティティ・オブジェクトに追加された新しい属性にアクセスできるようになります。エンティティ・オブジェクト、およびエンティティ・オブジェクト間のアソシエーションを拡張した場合、タイプ・セーフなバインディングが保持されます。元のエンティティ・オブジェクト内に記述されているアソシエーション・アクセッサは、拡張エンティティ・オブジェクトに継承され、元のアソシエーションを横断できます。

次の図に示すように、アソシエーションにより、共通の属性に基づいた関連元と関連先のエンティティ・オブジェクトの関係が定義されます。それぞれのエンティティ・オブジェクトには、アソシエーションを横断するアクセッサ・メソッドを定義できます。たとえば、DeptおよびEmpのエンティティ・オブジェクトがあり、Deptには、指定された部門のEmpオブジェクトの行セットを取り出すgetEmp()メソッドが含まれ、Empには、現行の部門を取り出すgetDept()メソッドが含まれているとします。

元のリンク元エンティティ・オブジェクトとリンク先エンティティ・オブジェクト

次の図に示すように、拡張エンティティ・オブジェクトには、その親のアソシエーションおよびアソシエーションのアクセッサが継承されます。拡張エンティティ・オブジェクトのアクセッサは、元のアソシエーションを横断できます。Deptエンティティ・オブジェクトを拡張すると、getEmp()メソッドはNewDeptExに継承され、元のアソシエーションを横断してEmpのデータを取り出せます。同様に、Empエンティティ・オブジェクトを拡張すると、getDept()メソッドはNewEmpExに継承され、Deptのデータを取り出せます。

アソシエーションの関連元エンティティ・オブジェクトと関連先エンティティ・オブジェクトの拡張

ただし、エンティティ・オブジェクトを拡張しても、元のアソシエーションは拡張されないことに注意してください。アソシエーションを拡張しないかぎり、NewEmpExからNewDeptExへ(またはNewDeptExからNewEmpExへ)のアクセッサはコールできません。アソシエーションを拡張することにより、アソシエーションを更新し、拡張エンティティ・オブジェクト間の関連付けを行えます。

拡張エンティティ・オブジェクト間のアソシエーションを拡張すると、次のように柔軟性の高い処理を実行できます。

次の図は、NewDeptExNewEmpExの拡張アソシエーションを表しています。

既存のアソシエーションの拡張

アソシエーションの拡張

次の例では、エンティティ・オブジェクトDeptおよびEmpを拡張したと仮定します。この手順では、元のエンティティ・オブジェクト間のアソシエーションを拡張することにより、拡張エンティティ・オブジェクトNewDeptExNewEmpEx間のアソシエーションを作成する方法について説明します。

  1. カスタマイズされたアソシエーションを含めるパッケージを右クリックし、「新規アソシエーション」を選択します。「アソシエーション」ウィザードが開きます。

  2. 名前ページで、新規アソシエーションの名前(NewFKAssocEx)を「名前」フィールドに入力します。柔軟性を高めるために、このページでは、「名前」「パッケージ」および「拡張アソシエーション」のフィールドが編集可能になっています。

  3. 「参照」をクリックし、「親」ダイアログを開きます。元のコンポーネントのパッケージを開き、拡張するアソシエーションを選択します。「OK」をクリックし、ダイアログを閉じます。名前ページで「次へ」をクリックし、エンティティ・オブジェクト・ページに進みます。

  4. アソシエーション・ページで、「関連元エンティティ・オブジェクトの選択」リストの拡張オブジェクトを含むパッケージを開き、NewDeptExエンティティ・オブジェクトを選択します。 NewDeptExは拡張アソシエーションの関連元として動作します。次に、「関連先エンティティ・オブジェクトの選択」リストの拡張オブジェクトを含むパッケージを開き、NewEmpExエンティティ・オブジェクトを選択します。NewEmpExは拡張アソシエーションの関連先として動作します。「次へ」をクリックし、関連元ロール属性ページに進みます。

  1. 関連元ロール属性ページで、関係を定義する、拡張アソシエーションのリンク元のエンティティ属性を選択します。リンク元およびリンク先の両方で、それぞれのエンティティ・オブジェクトに対して、同じ数の属性を、正しい順序で指定する必要があります。拡張エンティティ・オブジェクトに追加された新規の属性も使用可能であることに注意してください。この例では、Deptno「選択済の属性」リスト内に表示されていることを確認してください。

    オプションとして、キーを定義するすべての属性を指定できます。「選択済の属性」リストにキーを移動した場合、そのキーに関連付けられた属性が自動的に表示されます。また、関連元の属性ページでキーを選択した場合、一致するキー(該当する場合)が、デフォルトでリンク先の属性ページに含められます。「次へ」をクリックし、関連先の属性ページに進みます。

  2. 関連先ロール属性ページで、関係を定義する、拡張アソシエーションのリンク先のエンティティ属性を選択します。リンク元およびリンク先の両方で、それぞれのエンティティ・オブジェクトに対して、同じ数の属性を、正しい順序で指定する必要があります。「次へ」をクリックし、アソシエーション・プロパティ・ページに進みます。

  3. アソシエーション・プロパティ・ページでカーディナリティ、アクセッサまたはコンポジットのプロパティに対して必要な設定を行います。「次へ」をクリックし、「終了」を選択してアソシエーション・ウィザードを終了します。

JDeveloperで、新しいアソシエーションを定義するNewAssocEx.xmlファイルが生成されます。

生成された拡張アソシエーションファイルの理解

NewFKAssocExのアソシエーションは、ソース・コードを変更せずに、EmpForeignKeyAssocのアソシエーションの機能を拡張して作成されます。JDeveloperによりNewFKAssocEx.xmlファイルが作成され、このファイルはパッケージ化されたアプリケーション内にシームレスに統合できます。この時点で、NewFKAssocExというアソシエーションを実行時に使用できます。また、オリジナルのアプリケーション内のEmpForeignKeyAssocのすべてのインスタンスのかわりにこのビュー・オブジェクトを使用することもできます。アプリケーションでEmpForeignKeyAssocのすべてのインスタンスのかわりにNewFKAssocExを使用する方法の詳細は、「拡張ビジネス・コンポーネントの置換」を参照してください。

次に、NewFKAssocEx.xmlのコード・サンプルを示します。

1   <?xml version="1.0" encoding='WINDOWS-1252'?>
2   <!DOCTYPE Association SYSTEM "jbo_03_01.dtd">    
3   <Association
4 Name="NewFKAssocEx"
5 Extends="package27.EmpForeignKeyAssoc" >
6 <DesignTime>
7 <Attr Name="_isCodegen" Value="true" />
8 </DesignTime>
9 <AssociationEnd
10 Name="Dept"
11 Cardinality="0"
12 Source="true"
13 Owner="Extender.NewDeptEx" >
14 <AttrArray Name="Attributes">
15 <Item Value="package27.Dept.Deptno" />
16 </AttrArray>
17 </AssociationEnd>
18 <AssociationEnd
19 Name="Emp"
20 Cardinality="-1"
21 Owner="Extender.NewEmpEx" >
22 <AttrArray Name="Attributes">
23 <Item Value="package27.Emp.Deptno" />
24 </AttrArray>
25 </AssociationEnd>
26 </Association>

4から5行: Oracle ADF Business Componentsのフレームワークで、AssociationタグにNameおよびExtendsフィールドが追加され、新しいアソシエーションの名前(NewFKAssocEx)と、拡張元のアソシエーションの名前(package27.EmpEoreignKeyAssoc)が指定されます。

10から15行: フレームワークで、AssociationEndタグのNameOwnerSourceおよびItem Valueフィールドが使用され、元のアソシエーションの一方のエンティティの名前(Dept)、アソシエーションの一方の新しい所有者(Extender.NewDeptEx)、アソシエーションの関連元(Source="true")が指定され、外部キーの名前が、AttrArrayセクションのItemValueタグに追加されます(package27.Dept.Deptno)。

19から23行: 同様に、フレームワークで、AssociationEndタグのNameOwnerおよびItem Valueフィールドが使用され、元のアソシエーションのもう一方のエンティティの名前(Emp)、アソシエーションの一方の新しい所有者(Extender.NewEmpEx)が指定され、外部キーの名前が、AttrArrayセクションのItemValueタグに追加されます(package27.Emp.Deptno)。


ビジネス・コンポーネントの拡張