ビュー・オブジェクトがSQL問合せによりエンティティ・オブジェクト内のフィルタリングされた属性のサブセットおよびビジネス・ロジックを操作するのと同じように、拡張ビュー・オブジェクトも、拡張エンティティ・オブジェクト内の属性およびビジネス・ロジックを操作します。拡張ビュー・オブジェクトでは、新規属性、既存の属性に対する新規の定義と検証、および拡張エンティティ・オブジェクトに追加したビジネス・ロジックへのアクセス手段が提供されます。
図1は、元のコンポーネント、拡張コンポーネントおよびデータベース表の関係を示しています。通常、元のコンポーネントは既存のアプリケーションに属しています。拡張コンポーネントは、元のコンポーネントをカスタマイズしたものであり、アプリケーションのサイト固有性を高めたり、アプリケーションを異なるビジネス要件に適合させたりするために特化されています。
たとえば、あるベンダーが、Emp
エンティティ・オブジェクトとEmpView
ビュー・オブジェクトを含むコンポーネントのパッケージを配信するとします。このパッケージを購入した企業の開発者は、自社のビジネス要件に合せてパッケージ・コンポーネントをカスタマイズすることになります。まず、開発者は、Emp
エンティティ・オブジェクトを拡張し、属性およびビジネス・ロジックを追加します。次に、拡張エンティティのデータソースを提供するためにデータベース表を生成します。
拡張エンティティ・オブジェクトNewEmpEx
の既存の属性およびビジネス・ロジックと同様に、新規の属性およびビジネス・ロジックにもアクセスできるように、Emp
を使用するビュー・オブジェクトEmpView
を拡張することを選択します。拡張ビュー・オブジェクトは、最初に、元のエンティティ・オブジェクトEmp
を参照するその親からSQL問合せをコピーします。拡張ビュー・オブジェクトが拡張エンティティ・オブジェクトを参照するようにするには、次のような特定の要件が満たされている必要があります。
元のエンティティ・オブジェクトの属性が拡張エンティティの属性にマップされている場合。
元のエンティティ・オブジェクトの属性の慣用名の定義が拡張エンティティ・オブジェクトの慣用名でオーバーライドされている場合。
使用するビュー属性が拡張ビュー・オブジェクトの問合せのSELECTリスト内に表示されている場合。このリストには、拡張エンティティに追加された新規の属性も含まれている必要があります。
SQL問合せで、適切なデータソース、すなわち拡張エンティティ・オブジェクトに関連付けられた表が参照されている場合。
(オプション)SQL問合せのFROM
句またはWHERE
句に必要な変更を行い、必要なデータ・スライスのみを取得する場合。また、エキスパート・モードを使用し、任意の長さまたは複雑さのSQL文を作成するオプションもあります。
SELECT
リスト内の属性の順序およびデータ型が、問合せ結果を使用するアプリケーションにより期待される順序およびデータ型と一致している場合。
クライアントにエクスポートするメソッドが元のビュー・オブジェクトに含まれている場合は、それらのメソッドは拡張ビュー・オブジェクトに継承されます。メソッド・コードを変更する必要はありません。アプリケーションで拡張ビュー・オブジェクトに置き換え、それをビジネス・ロジック層にデプロイすると、クライアント・コードでは既存のインタフェースを使用してメソッドを使用できるようになります。
ビュー・オブジェクトを拡張せずに、拡張エンティティ・オブジェクトから直接新規のオブジェクトを作成する場合もあります。次の図はこれを説明したものです。元のビュー・オブジェクトまたはアプリケーションにより定義されている機能のいずれも新規のビュー・オブジェクトに含める必要がない場合には、この方法を使用できます。特に、特定のデータ・ビューしか必要とせず、元のアプリケーションに依存しないような新規のUIまたはJSPを作成する場合には、このようなビュー・オブジェクトが便利です。
たとえば、属性PensionPlan
およびCurrentWithholding
を追加しただけの拡張エンティティ・オブジェクトNewEmpEx
を作成するとします。PensionPlan
およびCurrentWithholding
で表されるデータのみを使用するUIまたはJSPを作成するのであれば、元のビュー・オブジェクトを拡張する必要はありません。この場合、SELECT
リスト内のこれらの属性のみを使用するビュー・オブジェクトを作成します。ビュー・オブジェクトの問合せにおける制限事項は、問合せで適切なデータソースを指定している必要があること、およびSELECT
リストに主キーが含まれている必要があることです。
一般に、次のような場合は、拡張エンティティからビュー・オブジェクトを直接作成する方が適切です。
新規ビュー・オブジェクトを置換えのために使用する予定がない場合(フレームワークでは、置き換えられるビュー・オブジェクトは、元のビュー・オブジェクトを継承した子であることが必要です)。
元のビュー・オブジェクトにより提供される機能のいずれも拡張ビュー・オブジェクトに含める必要がない場合。たとえば、元のビュー・オブジェクトに、カスタムJavaコードが記述されていない場合などです。
デプロイされたアプリケーションの一部として新規のビュー・オブジェクトを使用する場合、元のアプリケーション・モジュールのソース・コードは必要ありません。この場合は、元のアプリケーション・モジュールを拡張し、ビュー・オブジェクトをそのデータ・モデルに追加します。
「既存のエンティティ・オブジェクトの拡張」のトピックでは、Emp
と同じ属性と追加のYearsofService
属性が含まれるNewEmpEx
に、エンティティ・オブジェクトEmp
を拡張する方法を説明しています。次に、NewEmpEx
エンティティ・オブジェクトからデータベース内にNEWEMPEX
表を順方向生成で作成する方法について説明しています。このトピックでは、これらの説明の続きとして、拡張エンティティ・オブジェクトNewEmpEx
に対応するビュー・オブジェクトに、EmpView
ビュー・オブジェクトを拡張する例を示します。
カスタマイズしたビュー・オブジェクトを含めるパッケージを右クリックし、「新規ビュー・オブジェクト」を選択します。ビュー・オブジェクト・ウィザードが開きます。
「名前」ページで、新規ビューの名前(NewEmpViewEx
)を「名前」フィールドに入力します。柔軟性を高めるために、このページでは、「名前」、「パッケージ」、「拡張ビュー・オブジェクト」が編集可能になっていることに注意してください。
「拡張ビュー・オブジェクト」フィールドの隣にある「参照」ボタンをクリックし、「親」ダイアログを開きます。「親」ダイアログを使用し、NewEmpViewEx
の拡張元のビュー・オブジェクトを選択します。一般に、ビュー・オブジェクトは元のコンポーネントのパッケージから拡張します。この場合は、EmpView
を選択して「OK」をクリックします。これはベース・ビュー・オブジェクトがプロジェクトのパッケージ内にあることを示します。「次へ」をクリックし、「エンティティ・オブジェクト」ページに進みます。
「エンティティ・オブジェクト」ページでは、「使用可能」リスト・ボックスに、元のコンポーネントのパッケージおよび拡張コンポーネントのパッケージで使用可能なエンティティ・オブジェクトが表示されます。「選択済」リスト・ボックスに、ベース・ビュー・オブジェクトが参照するエンティティ・オブジェクトが表示されます(この場合、ベース・ビュー・オブジェクトはEmpViewで、それが参照するエンティティ・オブジェクトはEmpです)。Empエンティティ・オブジェクトの定義は、次のようにして拡張エンティティNewEmpExでオーバーライドできます。
「使用可能」リスト・ボックスで「NewEmp」を選択し、「選択済」リスト・ボックスで「Emp」を選択します。
右矢印ボタンをクリックします。アラート・ボックスが開き、「エンティティ・オブジェクトの慣用名EmpはエンティティEmpからそれを拡張するエンティティNewEmpExに更新されます。」というメッセージが表示されます。
「OK」をクリックします。
元のエンティティ・オブジェクトEmpの定義が、拡張エンティティ・オブジェクトNewEmpExの定義でオーバーライドされます。
また、最初に「選択済」リスト・ボックスで「Emp」を選択せずに、「使用可能」リスト・ボックスから「選択済」リスト・ボックスに「NewEmpEx」を移動することもできます。この場合、「選択済」リスト・ボックスにEmpとnewEmpの両方が表示され、NewEmpViewExは両方のエンティティを基にしています。つまり、EmpViewから継承された属性はEmpに基づき、新規の属性はNewEmpExに基づいています。すなわち、NewEmpViewExでは、EMPおよびNEWEMPという2つの表内のデータが問合せされ、更新されます。
「属性」ページの「使用可能」リスト・ボックスで、拡張ビュー・オブジェクトで拡張エンティティ・オブジェクトの属性すべてが使用可能になっていることに注意してください。「選択済」リスト・ボックス内の属性には、拡張ビュー・オブジェクトの問合せで使用可能にする属性がすべて含まれている必要があります。「選択済」リスト・ボックスに必要な属性を追加するには、矢印ボタンを使用します。この例では、YearsofService
属性を選択し、「使用可能」リスト・ボックスに移動します。「次へ」をクリックし、「属性の設定」ページに進みます。
「新規」をクリックし、拡張ビュー・オブジェクトの新規属性を作成します。「次へ」をクリックし、「属性の設定」ページに進みます。
「属性」ページで選択したビュー属性の保存プロパティおよび更新プロパティを変更するには、「属性の設定」ページを使用します。「次へ」をクリックし、「問合せ」ページに進みます。
「問合せ」ページで、ビュー・オブジェクト問合せを入力します。拡張ビュー・オブジェクトの場合、問合せは次の条件を満たしている必要があります。
拡張エンティティ・オブジェクトがデータを読み込む元の表が正しく指定されていること。一般に、これは拡張エンティティの表(この場合は
NewEmpEx
)になります。新規および元の属性が
SELECT
文中に存在していること。
SELECT
リスト内の属性の順序およびデータ型が、問合せ結果を使用するアプリケーションにより期待される順序およびデータ型と一致していること。
ヒント: 拡張ビュー・オブジェクトの問合せを作成する場合、まず「問合せ」ページで非エキスパート・モードを有効にし、JDeveloperの設計時に自動的に作成されるデフォルト問合せを検証します。非エキスパート・モードで設計時に作成される問合せは、常に正しい問合せになります。次に、エキスパート・モードを使用可能にし、SELECT
リストを変更せずに問合せを変更します。
拡張ビュー・オブジェクトの問合せを編集する方法の詳細は、「拡張ビュー・オブジェクトのSQL問合せの編集」を参照してください。
この例の場合、次のSELECT
文は3つの条件をすべて満たします。
SELECT Emp.YEARSOFSERVICE FROM NEWEMPEX EMP
したがって、この文は次のようになります。
SELECT Emp.EMPNO, Emp.ENAME, Emp.JOB, Emp.MGR, Emp.HIREDATE, Emp.SAL, Emp.COMM, Emp.DEPTNO, Emp.YEARSOFSERVICE FROM NEWEMPEX EMP
「次へ」をクリックし、「属性マッピング」ページに進みます。
「属性マッピング」ページでは、エキスパート・モードのSQL文内の列を削除、追加、または列の位置を入れ替えた場合に、属性に問合せ列を再マップできます。マップを変更するには、グリッドの右側にある属性をクリックします。ドロップダウン・リストで、問合せ列にマップする別の属性を選択します。特定の問合せ列に対するマップを削除することもできます。マップされていない問合せ列は更新できません。このページに必要事項を入力した後、「次へ」をクリックします。
「Java」ページで、拡張ビュー・オブジェクトおよび(オプションで)ビュー行のクラス(つまり、*Impl
クラス)を生成できるオプションを選択します。フレームワークによりこれらのクラスが作成された後は、クラスを編集し、拡張ビュー・オブジェクトの動作をカスタマイズできます。
「次へ」をクリックし、「終了」をクリックします。ビュー・オブジェクト・ウィザードにより、拡張ビュー・オブジェクトの .java
ファイル、.xml
ファイルおよび(オプションで)ビュー行の .java
ファイルが生成され、それらのファイル名がナビゲータに追加されます。
拡張ビュー・オブジェクトの作成を完了する前に、その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ファイルに含まれます。
Copyright © 1997, 2004, Oracle. All rights reserved.