既存のビュー・オブジェクトの拡張

ビュー・オブジェクトがSQL問合せによりエンティティ・オブジェクト内のフィルタリングされた属性のサブセットおよびビジネス・ロジックを操作するのと同じように、拡張ビュー・オブジェクトも、拡張エンティティ・オブジェクト内の属性およびビジネス・ロジックを操作します。拡張ビュー・オブジェクトでは、新規属性、既存の属性に対する新規の定義と検証、および拡張エンティティ・オブジェクトに追加したビジネス・ロジックへのアクセス手段が提供されます。

図1は、元のコンポーネント、拡張コンポーネントおよびデータベース表の関係を示しています。通常、元のコンポーネントは既存のアプリケーションに属しています。拡張コンポーネントは、元のコンポーネントをカスタマイズしたものであり、アプリケーションのサイト固有性を高めたり、アプリケーションを異なるビジネス要件に適合させたりするために特化されています。

たとえば、あるベンダーが、Empエンティティ・オブジェクトとEmpViewビュー・オブジェクトを含むコンポーネントのパッケージを配信するとします。このパッケージを購入した企業の開発者は、自社のビジネス要件に合せてパッケージ・コンポーネントをカスタマイズすることになります。まず、開発者は、Empエンティティ・オブジェクトを拡張し、属性およびビジネス・ロジックを追加します。次に、拡張エンティティのデータソースを提供するためにデータベース表を生成します(エンティティ・オブジェクトのカスタマイズおよびそれを目的としたデータソースの生成の詳細は、「既存のエンティティ・オブジェクトの拡張」を参照してください)。

Figure that shows the relationship between original and extended components    and tables, as described in the preceding paragraph.

拡張エンティティ・オブジェクトNewEmpExの既存の属性およびビジネス・ロジックと同様に、新規の属性およびビジネス・ロジックにもアクセスできるように、Empを使用するビュー・オブジェクトEmpViewを拡張することを選択します。拡張ビュー・オブジェクトは、最初に、元のエンティティ・オブジェクトEmpを参照するその親からSQL問合せをコピーします。拡張ビュー・オブジェクトが拡張エンティティ・オブジェクトを参照するようにするには、次のような特定の要件が満たされている必要があります。

拡張ビュー・オブジェクトでのエクスポート済メソッドの使用方法

クライアントにエクスポートするメソッドが元のビュー・オブジェクトに含まれている場合は、それらのメソッドは拡張ビュー・オブジェクトに継承されます。メソッド・コードを変更する必要はありません。アプリケーションで拡張ビュー・オブジェクトに置き換え、それをビジネス・ロジック層にデプロイすると、クライアント・コードでは既存のインタフェースを使用してメソッドを使用できるようになります。

拡張エンティティ・オブジェクトからのビュー・オブジェクトの直接作成

ビュー・オブジェクトを拡張せずに、拡張エンティティ・オブジェクトから直接新規のオブジェクトを作成する場合もあります。次の図はこれを説明したものです。元のビュー・オブジェクトまたはアプリケーションにより定義されている機能のいずれも新規のビュー・オブジェクトに含める必要がない場合には、この方法を使用できます。特に、特定のデータ・ビューしか必要とせず、元のアプリケーションに依存しないような新規のUIまたはJSPを作成する場合には、このようなビュー・オブジェクトが便利です。

Figure that shows creating a view object directly from an extended entity object, as described in the preceding paragraph.

たとえば、属性PensionPlanおよびCurrentWithholdingを追加しただけの拡張エンティティ・オブジェクトNewEmpExを作成するとします。PensionPlanおよびCurrentWithholdingで表されるデータのみを使用するUIまたはJSPを作成するのであれば、元のビュー・オブジェクトを拡張する必要はありません。この場合、SELECTリスト内のこれらの属性のみを使用するビュー・オブジェクトを作成します。ビュー・オブジェクトの問合せにおける制限事項は、問合せで適切なデータソースを指定している必要があること、およびSELECTリストに主キーが含まれている必要があることです。

一般に、次のような場合は、拡張エンティティからビュー・オブジェクトを直接作成する方が適切です。

デプロイされたアプリケーションの一部として新規のビュー・オブジェクトを使用する場合、元のアプリケーション・モジュールのソース・コードは必要ありません。この場合は、元のアプリケーション・モジュールを拡張し、ビュー・オブジェクトをそのデータ・モデルに追加します。

ビュー・オブジェクトの拡張方法

「既存のエンティティ・オブジェクトの拡張」のトピックでは、Empと同じ属性と追加のYearsofService属性が含まれるNewEmpExに、エンティティ・オブジェクトEmpを拡張する方法を説明しています。次に、NewEmpExエンティティ・オブジェクトからデータベース内にNEWEMPEX表を順方向生成で作成する方法について説明しています。このトピックでは、これらの説明の続きとして、拡張エンティティ・オブジェクトNewEmpExに対応するビュー・オブジェクトに、EmpViewビュー・オブジェクトを拡張する例を示します。

  1. カスタマイズしたビュー・オブジェクトを含めるパッケージを右クリックし、「新規ビュー・オブジェクト」を選択します。ビュー・オブジェクト・ウィザードが開きます。

  2. 「名前」ページで、新規ビューの名前(NewEmpViewEx)を「名前」フィールドに入力します。柔軟性を高めるために、このページでは、「名前」「パッケージ」「拡張ビュー・オブジェクト」が編集可能になっていることに注意してください。

  3. 「拡張ビュー・オブジェクト」フィールドの隣にある「参照」ボタンをクリックし、「親」ダイアログを開きます。「親」ダイアログを使用し、NewEmpViewExの拡張元のビュー・オブジェクトを選択します。一般に、ビュー・オブジェクトは元のコンポーネントのパッケージから拡張します。この場合は、EmpViewを選択して「OK」をクリックします。これはベース・ビュー・オブジェクトがプロジェクトのパッケージ内にあることを示します。「次へ」をクリックし、「エンティティ・オブジェクト」ページに進みます。

  4. 「エンティティ・オブジェクト」ページでは、「使用可能」リスト・ボックスに、元のコンポーネントのパッケージおよび拡張コンポーネントのパッケージで使用可能なエンティティ・オブジェクトが表示されます。「選択済」リスト・ボックスに、ベース・ビュー・オブジェクトが参照するエンティティ・オブジェクトが表示されます(この場合、ベース・ビュー・オブジェクトはEmpViewで、それが参照するエンティティ・オブジェクトはEmpです)。Empエンティティ・オブジェクトの定義は、次のようにして拡張エンティティNewEmpExでオーバーライドできます。

    1. 「使用可能」リスト・ボックスで「NewEmp」を選択し、「選択済」リスト・ボックスで「Emp」を選択します。

    2. 右矢印ボタンをクリックします。アラート・ボックスが開き、「エンティティの使用方法EmpはエンティティEmpからそれを拡張するエンティティNewEmpExに更新されます。」というメッセージが表示されます。

    3. 「OK」をクリックします。

    元のエンティティ・オブジェクトEmpの定義が、拡張エンティティ・オブジェクトNewEmpExの定義でオーバーライドされます。

    また、最初に「選択済」リスト・ボックスで「Emp」を選択せずに、「使用可能」リスト・ボックスから「選択済」リスト・ボックスに「NewEmpEx」を移動することもできます。この場合、「選択済」リスト・ボックスにEmpとnewEmpの両方が表示され、NewEmpViewExは両方のエンティティを基にしています。つまり、EmpViewから継承された属性はEmpに基づき、新規の属性はNewEmpExに基づいています。すなわち、NewEmpViewExでは、EMPおよびNEWEMPという2つの表内のデータが問合せされ、更新されます。

  5. 「属性」ページの「使用可能」リスト・ボックスで、拡張ビュー・オブジェクトで拡張エンティティ・オブジェクトの属性すべてが使用可能になっていることに注意してください。「選択済」リスト・ボックス内の属性には、拡張ビュー・オブジェクトの問合せで使用可能にする属性がすべて含まれている必要があります。「選択済」リスト・ボックスに必要な属性を追加するには、矢印ボタンを使用します。この例では、YearsofService属性を選択し、「使用可能」リスト・ボックスに移動します。「次へ」をクリックし、「属性の設定」ページに進みます。

  6. 「新規」をクリックし、拡張ビュー・オブジェクトの新規属性を作成します。「次へ」をクリックし、「属性の設定」ページに進みます。

  7. 「属性」ページで選択したビュー属性の保存プロパティおよび更新プロパティを変更するには、「属性の設定」ページを使用します。「次へ」をクリックし、「問合せ」ページに進みます。

  8. 「問合せ」ページで、ビュー・オブジェクト問合せを入力します。拡張ビュー・オブジェクトの場合、問合せは次の条件を満たしている必要があります。

    「次へ」をクリックし、「属性マッピング」ページに進みます。

  1. 「属性マッピング」ページでは、エキスパート・モードのSQL文内の列を削除、追加、または列の位置を入れ替えた場合に、属性に問合せ列を再マップできます。マップを変更するには、グリッドの右側にある属性をクリックします。ドロップダウン・リストで、問合せ列にマップする別の属性を選択します。特定の問合せ列に対するマップを削除することもできます。マップされていない問合せ列は更新できません。このページに必要事項を入力した後、「次へ」をクリックします。

  2. 「Java」ページで、拡張ビュー・オブジェクトおよび(オプションで)ビュー行のクラス(つまり、*Implクラス)を生成できるオプションを選択します。フレームワークによりこれらのクラスが作成された後は、クラスを編集し、拡張ビュー・オブジェクトの動作をカスタマイズできます。

  3. 「次へ」をクリックし、「終了」をクリックします。ビュー・オブジェクト・ウィザードにより、拡張ビュー・オブジェクトの .javaファイル、.xmlファイルおよび(オプションで)ビュー行の .javaファイルが生成され、それらのファイル名がナビゲータに追加されます。

拡張ビュー・オブジェクトのSQL問合せの編集

拡張ビュー・オブジェクトの作成を完了する前に、そのSQL問合せを手動で編集する必要がある場合があります。特に、新規の属性を追加した場合や、データソースを変更した場合には、編集が必要になります。元のビュー・オブジェクトの問合せを、編集を始める際の開始点と考えることができます。拡張オブジェクトを作成した場合、ビュー・オブジェクト・ウィザードの「問合せ」ページに、元のビュー・オブジェクトの問合せの作成時にエキスパート・モードが使用可能あるいは使用不可になっていたかに応じて元の問合せが表示されます。

他の属性またはプロパティの設定と同じように、ビュー・オブジェクトのエキスパート・モード状態も、拡張オブジェクトに継承できます。たとえば、エキスパート・モードが使用不可の状態で元のビュー・オブジェクトが作成された場合、拡張オブジェクトのビュー・オブジェクト・ウィザードは、エキスパート・モードが使用不可になった状態で開きます。同様に、エキスパート・モードで元のビュー・オブジェクトが作成された場合は、拡張オブジェクトの「問合せ」ページはエキスパート・モードで開きます。

ビュー・オブジェクトの問合せがエキスパート・モードで作成されたかどうかは、その .xmlファイルを調べ、ViewObjectタグ内のCustomQuery変数の値を検索するとすぐにわかります。次に例を示します。

<ViewObject
Name="DeptVExpertEx"
Extends="package28.DeptViewExpert"
BindingStyle="Oracle"
CustomQuery="true" <-- indicates Expert Mode is enabled

trueの値はビュー・オブジェクトの問合せがエキスパート・モードで作成されたことを示し、Falseは非エキスパート・モードで作成されたことを示します。

非エキスパート・モードでの編集

元のビュー・オブジェクトが非エキスパート・モードで(つまり、「エキスパート・モード」チェックボックスのチェックが外された状態で)作成された場合、拡張オブジェクトのビュー・オブジェクト・ウィザードは、エキスパート・モードが使用不可になった状態で開きます。この場合、「問合せ」ページの「問合せ文」領域にある読取り専用のリスト・ボックス内にデフォルトのSQL問合せが表示されます。

エキスパート・モードが使用可能になった状態での編集

元のビュー・オブジェクトがエキスパート・モードで作成された場合、拡張オブジェクトの「問合せ」ページはエキスパート・モードで開きます。この場合、「問合せ」ページの「問合せ文」領域に、空の編集可能なリスト・ボックスが表示されます。ここでも、元のビュー・オブジェクトからのSQL問合せが、編集の際の開始点になります。元のビュー・オブジェクトの .xmlファイルから問合せをコピーし、ページ内に貼り付けることができます。問合せは、ファイルのViewObjectセクションのSQLQueryタグ内に表示されます。次に例を示します。

<SQLQuery><![CDATA[
SELECT Dept.DEPTNO, Dept.DNAME, Dept.LOC <-- SQL query
FROM DEPT Dept
]]></SQLQuery>

問合せは、ページ内に貼り付けた後に編集できます。元の問合せから開始せず、次のようにすることも可能です。

または

生成された拡張ビュー・オブジェクト・ファイルの理解

NewEmpViewExビュー・オブジェクトは、ソース・コードを変更せずに、EmpViewビュー・オブジェクトの機能を拡張して作成されます。JDeveloperによりNewEmpViewEx.javaファイルと .xmlファイルが作成され、このファイルはパッケージ化されたアプリケーション内にシームレスに統合できます。この時点で、NewEmpViewExビュー・オブジェクトを実行時に使用できますが、.javaファイルに計算済の属性など、いくつかの機能を追加する場合があります。その場合、元のアプリケーション内のEmpViewのすべてのインスタンスのかわりにこのビュー・オブジェクトを使用できます。

次のコードは、非エキスパート・モードで作成されたNewEmpViewEx.xmlのサンプル・コードです。NewEmpViewEx.xmlに、参照先の拡張エンティティ・オブジェクトの属性に基づいたSQL問合せが含まれていることに注意してください。このファイルには、新規属性、またはオーバーライドされた元のビュー・オブジェクトからの属性のみの定義が含まれます。

非エキスパート・モードで作成されたビュー・オブジェクトのコードは、エキスパート・モードで作成されたビュー・オブジェクトのコードとは異なります。両者の違いは、サンプル・コードに続くセクションで説明しています。

1   <?xml version="1.0" encoding='WINDOWS-1252'?>
2 <!DOCTYPE ViewObject SYSTEM "jbo_03_01.dtd">
3   <ViewObject
4   Name="NewEmpViewEx"
5   Extends="package27.EmpView"
6   SelectList="Emp.EMPNO, Emp.ENAME, Emp.JOB, Emp.MGR, Emp.HIREDATE, Emp.SAL,
Emp.COMM, Emp.DEPTNO, Emp.SERVICEINYEAR"
7   FromList="NEWEMPEX Emp"
8   BindingStyle="Oracle"
9   CustomQuery="false"
10   ComponentClass="Extender.NewEmpViewExImpl" >
11   <DesignTime>
12   <Attr Name="_codeGenFlag" Value="20" />
13   </DesignTime>
14   <EntityUsage
15   Name="Emp"
16   Entity="Extender.NewEmpEx" >
17   <DesignTime>
18   <Attr Name="_ReadOnly" Value="false" />
19   <Attr Name="_EntireObjectTable" Value="false" />
20   <Attr Name="_queryClause" Value="false" />
21   </DesignTime>
22   </EntityUsage>
23   <ViewAttribute
24   Name="Hiredate"
25   EntityAttrName="Hiredate"
26   EntityUsage="Emp"
27   AliasName="HIREDATE" >
28   <DesignTime>
29   <Attr Name="_OverrideAttr" Value="true" />
30   <Attr Name="_DisplaySize" Value="0" />
31 </DesignTime>
32   </ViewAttribute>
...
    //  definitions of the other view attributes
   ...
     </DesignTime>
  </ViewAttribute>
</ViewObject>

4から9行: NameフォールドおよびExtendsフィールドには、拡張ビュー・オブジェクトの名前(NewEmpViewEx)および拡張する元のビュー・オブジェクトの名前(package27.EmpView)が示されます。SelectListフィールドには、問合せに含まれる属性の名前が示されます。デフォルトでは、SELECTリストにはすべてのビュー属性が含まれます。FromListには、SelectListフィールドで指定された表の名前の別名が示され、問合せが行われる適切なデータソースが示されます。問合せは非エキスパート・モードで作成されているため、CustomQueryの値は"false"です。

ビュー・オブジェクト問合せがエキスパート・モードで作成されている場合は、SelectListフィールドとFromListフィールドは任意のSQL文が表示されたSQLQueryフィールドに置き換わり、CustomQueryの値は"true"に設定されます。次のコードは、エキスパート・モードの問合せで作成されたビュー・オブジェクトに対してフレームワークにより提供されるコードのSnippetです。

   ...
CustomQuery="true"
ComponentClass="Extender.NewEmpViewExImpl" >
<SQLQuery><![CDATA[
Select * from NEWEMPEX Emp
]]></SQLQuery>
...

10行: ComponentClassフィールドには、拡張ビュー・オブジェクトの実装ファイル(つまり、*Implファイル)の名前が示されます。

15から16行: Nameフィールドには元のエンティティ・オブジェクトの名前(Emp)、Entityフィールドにはこの拡張ビュー・オブジェクトが参照する拡張エンティティの名前(Extender.NewEmpEx)が示されます。

23行: ビュー属性の定義は、個々のViewAttributeタグ内にあります。新規の属性と、元のビュー・オブジェクトからオーバーライドされた属性のみが、拡張ビュー・オブジェクトのXMLファイルに含まれます。