エンタープライズ・アプリケーションを開発し、デプロイした後に、新しい機能または特性の追加が必要になる場合があります。ビジネス・コンポーネントは再利用可能で、既存のコンポーネントをニーズに合せてカスタマイズできます。たとえば、デプロイしたアプリケーションにEMPエンティティ・オブジェクトが含まれている場合、電話番号、勤続年数、年金、および年金の種類に基づいて給与の源泉徴収を計算するためのビジネス・ロジックなどの追加情報に対応するために、この定義の拡張が必要な場合があります。これは、エンティティ・オブジェクトをカスタマイズする1つの例にすぎません。次の場合も、エンティティ・オブジェクトをカスタマイズします。
エンティティ・オブジェクトに対する新しい属性の追加。これらの追加属性に、提供されているビジネス・コンポーネントの一部である基本情報に加えて、特定のサイトで記録する必要のある他の情報を追加属性に格納できます。たとえば、計算値としてYearsOfService
属性を追加し、Emp
エンティティ・オブジェクトを拡張できます。
特定のサイトに固有の構造を表すエンティティ・オブジェクトを新たに作成し、この新規エンティティとデプロイされたアプリケーションの既存のエンティティ・オブジェクトの関連付け。
ビジネス・ロジックをサイトのニーズに合せるための、デプロイされたアプリケーションのエンティティ・オブジェクトに対するJavaコードの追加、変更および補足。たとえば、Customer
エンティティ・オブジェクトの場合、Customer
のAddress
属性を調べ、距離に基づいて送料を算出するビジネス・ロジックを追加し、エンティティ・オブジェクトを拡張できます。
既存のエンティティ属性に対する検証規則の追加。属性に検証規則を追加すると、それぞれの規則がAND
で結ばれます。たとえば、元のCustomer
エンティティ・オブジェクトのCreditRating
属性に、「200ポイントを超える値」という規則があるとします。拡張エンティティ・オブジェクトでは、支払が期限を過ぎていないかを確認する規則を追加できます。いずれかの規則に当てはまらない場合は、例外がスローされます。
エンティティ属性のデフォルト値の変更。たとえば、Emp
エンティティ・オブジェクトにPhone
属性が定義されている場合は、拡張エンティティ・オブジェクトでは、代表電話番号をデフォルト値として指定できます。これは、後で従業員の直通番号に置き換えることができます。
既存コンポーネントを、そのコンポーネントが使用されているアプリケーションを変更することなく、拡張したコンポーネントでグローバルに置換。これについては、「ビジネス・コンポーネントの置換」で説明します。
アプリケーションのエンティティ・オブジェクトでデータベース内の表を参照するのと同様に、拡張エンティティ・オブジェクトでも表を参照します。拡張エンティティ・オブジェクトをサポートする表を提供するには、次の2つの方法があります。
既存のデータベース表を変更し、必要な列を追加。この場合には、元のエンティティ・オブジェクトと拡張エンティティ・オブジェクトの両方で同じ表を参照します。
または
拡張エンティティ・オブジェクトに対して、先頭列が親エンティティ・オブジェクトの表と一致する表をデータベースに新たに作成。この場合には、元のエンティティ・オブジェクトと拡張エンティティ・オブジェクトの両方で、別々の表を参照します。
アプリケーションで、親および拡張エンティティ・オブジェクトの両インスタンスを同時に扱う場合、最も簡単な方法は、各エンティティ・オブジェクトがそれぞれデータベース表を持つことです。この場合には、拡張エンティティ・オブジェクトにデータベース表を提供するには、次の2つの方法があります。
拡張エンティティ・オブジェクトに対応する表をデータベースに作成。この表は、少なくとも、ベース・エンティティ・オブジェクト(すなわち、拡張元エンティティ・オブジェクト)に対応する表と同じ数の列および同じ主キーを持つ必要があります。必須ではありませんが、表の列の順序も同じにすることをお薦めします。拡張コンポーネントに必要な列を表に追加できます。つまり、新規表は元の表と同じ機能のすべてと追加の列を持つ必要があります。新規表の作成後は、エンティティ・オブジェクト・ウィザードを使用して、拡張コンポーネントを作成します。
ベース・コンポーネントとして使用するエンティティ・オブジェクトを指定し、ウィザードで拡張したエンティティ・オブジェクトを作成。その後、JDeveloperのナビゲータで拡張エンティティ・オブジェクトを選択し、「データベース・オブジェクトの作成」を使用して、対応する表をデータベースに作成します。たとえば、EMP
表を参照するEmp
エンティティ・オブジェクトを指定した場合、Emp
を拡張することによりNewEmpEx
エンティティ・オブジェクトを作成できます。その後で順方向生成を使用し、データベース内にNEWEMP
表を作成します。次の図はこれを説明したものです。
次の例では、前述の2番目の方法(ウィザードを使用してエンティティ・オブジェクトを拡張し、その後で順方向生成を使用してデータベース内に表を作成する方法)を示します。この例では、プロジェクトの作成、オリジナル・コンポーネントのパッケージのインポート、および拡張コンポーネントを定義するためのパッケージの作成が終了しているものとします。
ベンダー(たとえば、オラクル社)が、従業員データを処理するEmp
コンポーネントを販売し、Solutions Techという(架空の)会社がそれをカスタマイズするとします。開発者は、次の手順に従って、NewEmp
というカスタム・コンポーネントを作成します。
NewEmpEx
)を「名前」フィールドに入力します。柔軟性を高めるために、このページでは「名前」、「パッケージ」、「拡張エンティティ」および「スキーマ・オブジェクト」フィールドが編集可能になっていることに注意してください。
NewEmpEx
の拡張元のエンティティ・オブジェクトを選択します。この場合は、Emp
を選択して「OK」をクリックします。ベース・オブジェクトはプロジェクトのパッケージにあることに注意してください。
NewEmpEx
のその他の機能を指定します。たとえば、「新規エンティティ属性」ダイアログ(「属性」ページで「新規」をクリックすると、開きます)を使用し、Number
型のYearsOfService
属性を作成します。既存のエンティティ・オブジェクトの属性に変更を加えている場合は、「表からの新規作成」を使用します。「属性」ページでは、属性のセット全体ではなく、新規またはオーバーライドされた属性のみ表示されることに注意してください。NewEmpEx.xml
に格納されます。
extends
キーワードを使用し、ウィザードで自動的に行われます。Solutions Techで事前に作成されているビジネス・ロジックをオーバーライドする場合、このファイルを編集できます。
NewEmpEx
エンティティ・オブジェクトが作成されます。フレームワークにより、拡張エンティティ・オブジェクトに対する .java
および .xml
ファイルが作成されます。
NewEmpEx
を「作成するオブジェクト」側へ移動し、「OK」をクリックします。NewEmpEx
に対応する表がデータベースに作成されます。
拡張エンティティ・オブジェクトを既存の表から作成する場合は、次のステップに従ってください。
NewEmpEx
)を「名前」フィールドに入力します。柔軟性を高めるために、このページでは「名前」、「パッケージ」、「拡張エンティティ」および「スキーマ・オブジェクト」フィールドが編集可能になっていることに注意してください。
NewEmpEx
の拡張元のエンティティ・オブジェクトを選択します。この場合は、Emp
を選択して「OK」をクリックします。ベース・オブジェクトはプロジェクトのパッケージにあることに注意してください。
extends
キーワードを使用し、ウィザードで自動的に行われます。Solutions Techで事前に作成されているビジネス・ロジックをオーバーライドする場合、このファイルを編集できます。
NewEmpEx
エンティティ・オブジェクトが作成されます。フレームワークにより、拡張エンティティ・オブジェクトに対する .java
および .xml
ファイルが作成されます。
NewEmpEx
エンティティ・オブジェクトは、ソース・コードを変更せずに、Emp
エンティティの機能を拡張して作成されます。JDeveloperによりNewEmp
の .java
ファイルと .xml
ファイルが作成され、このファイルはパッケージ化されたアプリケーション内にシームレスに統合できます。この時点で、NewEmpEx
エンティティ・オブジェクトを、実行時に使用できますが、.java
ファイルにビジネス・ロジックや検証などの機能の追加が必要な場合があります。その場合、元のアプリケーション内のEmp
のすべてのインスタンスのかわりにこのビュー・オブジェクトを使用できます。アプリケーションでEmp
のすべてのインスタンスのかわりにNewEmpEx
を使用する方法の詳細は、「ビジネス・コンポーネントの置換」を参照してください。
NewEmpEx
エンティティ・オブジェクトのXMLファイルには、元のエンティティ・オブジェクトと、拡張エンティティ・オブジェクトの定義の差異のみが含まれることに注意してください。次に、NewEmpEx.xml
のコード・サンプルを示します。
1 <?xml version="1.0" encoding='WINDOWS-1252'?>
2 <!DOCTYPE Entity SYSTEM "jbo_03_01.dtd">
3 <Entity
4 Name="NewEmpEx"
5 Extends="package27.Emp"
6 DBObjectType="table"
7 DBObjectName="NEWEMPEX"
8 AliasName="NewEmpEx"
9 BindingStyle="Oracle"
10 CodeGenFlag="20"
11 RowClass="Extender.NewEmpExImpl"
12 DefClass="Extender.NewEmpExDefImpl" >
13 <DesignTime>
14 <Attr Name="_isCodegen" Value="true" />
15 <Attr Name="_superClass" Value="package27.EmpImpl" />
16 <AttrArray Name="_publishEvents">
17 </AttrArray>
18 </DesignTime>
19 <Attribute
20 Name="Serviceinyear"
21 Type="oracle.jbo.domain.Number"
22 ColumnName="SERVICEINYEAR"
23 ColumnType="NUMBER"
24 SQLType="NUMERIC"
25 Precision="2"
26 Scale="0"
27 TableName="EMP1" >
28 <DesignTime>
29 <Attr Name="_DisplaySize" Value="0" />
30 </DesignTime>
31 </Attribute>
32 </Entity>
4から7行: Name
、Extends
、DBObjectType
およびDBObjectName
フィールドには、拡張コンポーネントの名前(NewEmpEx
)、拡張元コンポーネントの名前(package27.Emp
)、参照するスキーマ・オブジェクトのタイプ(table
)およびデータベース・オブジェクトの名前(NEWEMPEX
)が含まれています。
20から30行: Attribute
タグには、拡張エンティティ・オブジェクトに設計時に追加された属性の情報が含まれています。元の属性の情報は、元のコンポーネント(package27.Emp
)から取得されます。このタグに元のエンティティ・オブジェクトの属性情報が含まれるのは、「属性」ページの「表からの新規作成」でエンティティを選択し、その後「属性の設定」ページで定義を変更した場合のみになります。
Copyright © 1997, 2004, Oracle. All rights reserved.