インタフェース・ディスクリプタとは、参照クラスがインタフェースであるディスクリプタのことです。TopLinkで指定された各ドメイン・クラスには関連ディスクリプタがあります。ディスクリプタは、リレーショナル・データベースにおけるオブジェクトのデータの表し方を示すマッピングのセットです。これには属性の格納および取得に必要な変換ルーチンだけでなく、クラス・インスタンス変数から表のフィールドへのマッピングが含まれています。ディスクリプタはJavaオブジェクトとそのデータベース表示の間のリンクとして機能します。
インタフェースは他のクラスが使用できる抽象動作の集まりです。これは純粋なJavaオブジェクトの概念であり、リレーショナル・データベース上には表れません。このため、インタフェースに定義されているディスクリプタはデータベース上のリレーショナル・エンティティをマップしません。
インタフェース・ディスクリプタで定義されるコンポーネントを次に示します。
インタフェース・ディスクリプタは、関連付けられている具体的なデータまたは表がないため、マッピングを定義しません。インタフェースで問合せを発行できるように抽象問合せキーのリストが定義されます。インタフェースにおける読取り問合せによってその1つ以上のインプリメンタが読み取られます。
次の図は、2つのディスクリプタで実装されるインタフェースを示します。
図4-22 インタフェースを実装するクラス
EmailおよびPhoneのディスクリプタに対するサンプル・コード実装を次に示します。
Descriptor descriptor = new Descriptor();
descriptor.setJavaInterface(Contact.class);
descriptor.addAbstractQueryKey("id");
return descriptor;
Descriptor descriptor = new Descriptor();
descriptor.setJavaClass(Email.class);
descriptor.addDirectQueryKey("id", "E_ID");
descriptor.getInterfacePolicy().addParentInterface(Contact.class);
descriptor.setTableName("INT_EML");
descriptor.setPrimaryKeyFieldName("E_ID");
descriptor.setSequenceNumberName("SEQ");
descriptor.setSequenceNumberFieldName("E_ID");
descriptor.addDirectMapping("emailID", "E_ID");
descriptor.addDirectMapping("address", "ADDR");
return descriptor;
Descriptor descriptor = new Descriptor();
descriptor.setJavaClass(Phone.class);
descriptor.getInterfacePolicy().addParentInterface(Contact.class);
descriptor.addDirectQueryKey("id", "P_ID");
descriptor.setTableName("INT_PHN");
descriptor.setPrimaryKeyFieldName("P_ID");
descriptor.setSequenceNumberName("SEQ");
descriptor.setSequenceNumberFieldName("P_ID");
descriptor.addDirectMapping("phoneID", "P_ID");
descriptor.addDirectMapping("number", "P_NUM");
return descriptor;
Contactインタフェースが別のインタフェースを拡張した場合は、次のメソッドをコールしてその親を設定します。
descriptor.getInterfacePolicy().addParentInterface(Interface.class);
ドメイン・オブジェクトのインタフェースのみが表示可能なアプリケーションには、単一インプリメンタ・インタフェースを使用します。各ドメイン・クラスにはそれぞれの一意インタフェースがあり、他のドメイン・クラスはそのインタフェースを実装しません。他のドメイン・オブジェクトへの参照もインタフェースを経由します。
このようなアプリケーションでは、各インタフェースに対するディスクリプタの定義は負荷が大きく、不必要な場合もあります。TopLinkではこのようなインタフェースのディスクリプタの定義は必ずしも必要ではありません。ディスクリプタはドメイン・クラスに対して定義され、その親インタフェースは通常どおり設定されます。
ディスクリプタを初期化している間、インタフェースはそのインプリメンタのディスクリプタを付与されます。このプロセスではドメイン・クラスおよびそのインタフェース両方への問合せが可能です。唯一の制限は、各インタフェースが一意のインプリメンタを保持している必要があることです。つまり、ディスクリプタが複数のインプリメンタを保持していない場合はインタフェースにディスクリプタは不要です。
Copyright © 1997, 2004, Oracle. All rights reserved.