JDeveloperには、拡張Associationの機能が用意されています。この機能を利用して、拡張エンティティ・オブジェクト間のAssociation関係を保持できます。また、Associationを拡張することにより、拡張エンティティ・オブジェクトに追加された新しい属性にアクセスできるようになります。エンティティ・オブジェクト、およびエンティティ・オブジェクト間のAssociationを拡張した場合、タイプ・セーフなバインディングが保持されます。元のエンティティ・オブジェクト内に書かれているAssociationアクセッサは、拡張エンティティ・オブジェクトに継承され、元のAssociationを横断できます。
次の図に示すように、Associationにより、共通の属性に基づいた関連元と関連先のエンティティ・オブジェクトの関係が定義されます。それぞれのエンティティ・オブジェクトには、Associationを横断するアクセッサ・メソッドを定義できます。たとえば、Dept
およびEmp
のエンティティ・オブジェクトがあり、Dept
には、指定された部門のEmp
オブジェクトの行セットを取り出すgetEmp()
メソッドが含まれ、Emp
には、現行の部門を取り出すgetDept()
メソッドが含まれているとします。
次の図に示すように、拡張エンティティ・オブジェクトには、その親のAssociationおよびAssociationのアクセッサが継承されます。拡張エンティティ・オブジェクトのアクセッサは、元のAssociationを横断できます。Dept
エンティティ・オブジェクトを拡張すると、getEmp()
メソッドはNewDeptEx
に継承され、元のAssociationを横断してEmp
のデータを取り出せます。同様に、Emp
エンティティ・オブジェクトを拡張すると、getDept()
メソッドはNewEmpEx
に継承され、Dept
のデータを取り出せます。
ただし、エンティティ・オブジェクトを拡張しても、元のAssociationは拡張されないことに注意してください。Associationを拡張しないかぎり、NewEmpEx
からNewDeptEx
へ(またはNewDeptEx
からNewEmpEx
へ)のアクセッサはコールできません。Associationを拡張することにより、Associationを更新し、拡張エンティティ・オブジェクト間の関連付けを行えます。
拡張エンティティ・オブジェクト間のAssociationを拡張すると、次のように柔軟性の高い処理を実行できます。
拡張された新しいエンティティ属性を、関連元および関連先のロール属性として選択できます。
既存のAssociationプロパティの値(カーディナリティやコンポジットなど)を選択できます。
次の図は、NewDeptEx
とNewEmpEx
の拡張Associationを表しています。
次の例では、エンティティ・オブジェクトDept
およびEmp
を拡張したと仮定します。この手順では、元のエンティティ・オブジェクト間のAssociationを拡張することにより、拡張エンティティ・オブジェクトNewDeptEx
とNewEmpEx
間のAssociationを作成する方法について説明します。
カスタマイズされたAssociationを含めるパッケージを右クリックし、「新規Association」を選択します。Associationウィザードが開きます。
「名前」ページで、新規Associationの名前(NewFKAssocEx
)を「名前」フィールドに入力します。柔軟性を高めるために、このページでは、「名前」、「パッケージ」および「拡張Association」のフィールドが編集可能になっています。
「参照」をクリックし、「親」ダイアログを開きます。元のコンポーネントのパッケージを開き、拡張するAssociationを選択します。「OK」をクリックし、ダイアログを閉じます。「名前」ページで「次へ」をクリックし、「エンティティ・オブジェクト」ページに進みます。
「関連元属性の選択」で、関係を定義する拡張Associationの関連元エンティティ属性を選択します。拡張エンティティ・オブジェクトに追加された新規の属性も使用可能であることに注意してください。この例では、NewDeptEx
エンティティ・オブジェクトのDeptno
属性を関連元属性として選択します。
「関連先の属性の選択」で、関係を定義する拡張Associationの関連先エンティティ属性を選択します。この例では、NewDeptEx
エンティティ・オブジェクトのDeptno
属性を関連先属性として選択します。
「カーディナリティ」リスト・ボックスで、関連の多重度を選択します。この例では「0..1対*」を選択します。以上を設定したら「追加」をクリックし、関連の新規エントリを追加します。「次へ」をクリックし、「Associationプロパティ」ページに進みます。
「Associationプロパティ」ページでアクセッサ、またはコンポジットのプロパティに対して必要な設定を行います。「次へ」をクリックし、「終了」を選択してAssociationウィザードを終了します。
JDeveloperで、新しいAssociationを定義するNewAssocEx.xml
ファイルが生成されます。
NewFKAssocEx
のAssociationは、ソース・コードを変更せずに、EmpForeignKeyAssoc
のAssociationの機能を拡張して作成されます。JDeveloperによりNewFKAssocEx
の .xml
ファイルが作成され、このファイルはパッケージ化されたアプリケーション内にシームレスに統合できます。この時点で、NewFKAssocEx
というAssociationを実行時に使用できます。また、オリジナルのアプリケーション内の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行: Business Components for Javaのフレームワークで、Association
タグにName
およびExtends
フィールドが追加され、新しいAssociation(NewFKAssocEx
)と、拡張元のAssociationの名前(package27.EmpEoreignKeyAssoc
)が指定されます。
10から15行: フレームワークで、AssociationEnd
タグのName
、Owner
、Source
およびItem Value
フィールドが使用され、元のAssociationの一方のエンティティの名前(Dept
)、Associationの一方の新しい所有者(Extender.NewDeptEx
)、Associationの関連元(Source="true"
)が指定され、外部キーの名前が、AttrArray
セクションのItemValue
タグに追加されます(package27.Dept.Deptno
)。
19から23行: 同様に、フレームワークで、AssociationEnd
タグのName
、Owner
およびItem Value
フィールドが使用され、元のAssociationのもう一方のエンティティの名前(Emp
)、Associationの一方の新しい所有者(Extender.NewEmpEx
)が指定され、外部キーの名前が、AttrArray
セクションのItemValue
タグに追加されます(package27.Emp.Deptno
)。