多相行セットについて
様々なタイプのエンティティ・オブジェクトまたはビュー・オブジェクトを、同じ行セットにマップできます。またクライアントは、オブジェクトのタイプについて認識せずに、行セットを処理することができます。
多相性は、エンティティ・オブジェクト・レベル、ビュー・オブジェクト・レベル、あるいはその両方で使用できます。
エンティティ・オブジェクト・レベルでの多相性
表の行を様々なエンティティ・オブジェクトにマップするとします。たとえば、Platinum、GoldおよびSilverという顧客の表があり、それぞれの行で異なる処理を実行するとします。Business Components for Javaでは、次の手順でこの処理を実行できます。
- 行のベース・エンティティ・オブジェクトを定義し、これを拡張してこのエンティティ・オブジェクトの別バージョンを作成します。この例では、ベースはCustomersエンティティ・オブジェクトで、子はPlatinumCustomers、GoldCustomersおよびSilverCustomersエンティティ・オブジェクトになります。
- ベース・エンティティ・オブジェクトで、異なるタイプの行を区別するために使用するエンティティ属性を作成します。この属性については、「多相化識別子」属性設定を選択します。ベース・エンティティ・オブジェクトのそれぞれの子で、この属性に一意のデフォルト値を追加します。この例では、3つの子エンティティ・オブジェクトのデフォルト値はPlatinum、GoldおよびSilverとなります。
- 子エンティティ・オブジェクトで、そのタイプのエンティティ・オブジェクトの処理に固有の属性を削除または追加します。エンティティ・オブジェクトに応じて、様々な機能のメソッドを追加することもできます。ベース・クラスにスケルトン・メソッドを追加して、子クラスでそのメソッドをカスタマイズすることもできます。
- ビュー・オブジェクト・ウィザードまたはビュー・オブジェクト・エディタの「エンティティ・オブジェクト」ページで、ベース・エンティティ・オブジェクトを選択します。その後、「サブタイプ」ダイアログで子エンティティ・オブジェクトを選択します。これにより、エンティティ・オブジェクトを使用するビュー・オブジェクトで、子エンティティ・オブジェクトが使用可能になります。
一般的には、識別子列を使用しますが、フレームワークでの表の識別子列の使用は必須ではありません。たとえば、識別子属性は計算された値から導出できます。
ベース・エンティティ・オブジェクトを行タイプにする(つまり、データソースの行のタイプに関連付ける)ことも、子エンティティ・オブジェクトのみを行タイプとして使用し、ベースは単にテンプレートとすることも可能です。
ビュー・オブジェクト・レベルでの多相性
エンティティ・オブジェクト・レベルで多相性を実装したかどうかに関係なく、ビュー・オブジェクト・レベルで多相性を実装できます。エンティティ・オブジェクト・レベルと同様に、次の手順で多相性を実現できます。
- 行のベース・ビュー・オブジェクトを定義し、これを拡張してこのビュー・オブジェクトの別バージョンを作成します。たとえば、ベースはDeptビュー・オブジェクトで、子はLargeDeptおよびSmallDeptビュー・オブジェクトとします。
- ベース・ビュー・オブジェクトにおいて、異なるタイプの行を区別するために使用するビュー属性を作成します。この属性については、「多相化識別子」属性設定を選択します。ベース・ビュー・オブジェクトのそれぞれの子で、この属性に一意のデフォルト値を追加します。この例では、2つの子ビュー・オブジェクトのデフォルト値はSまたはLとなります。
- アプリケーション・モジュール・ウィザードまたはアプリケーション・モジュール・エディタの「データ・モデル」ページで、ベース・ビュー・オブジェクトを選択します。その後、「サブタイプ」ダイアログで子ビュー・オブジェクトを選択します。これにより、ビュー・オブジェクトを使用するアプリケーション・モジュールで、子ビュー・オブジェクトが使用可能になります。
データベースから行を取得すると、ViewObjectImpl createRowFromResultSet
メソッドがコールされます。このメソッドは、ビュー・オブジェクトの識別子属性を取得して、ターゲットのビュー・オブジェクト定義を判別します。次に、その定義を使用して、適切な行を作成します。このメソッドはオーバーライドできます。
多相行セットのコーディング
多相行セットを操作するとき、コードで処理する必要がある属性リストが多くなります。レガシー・アプリケーションの場合、多相行セットを実装するには、コードの修正が必要な場合があります。
関連項目
ビュー・オブジェクトとは
エンティティ・オブジェクトとは