インタフェース・ディスクリプタとは、参照クラスがインタフェースであるディスクリプタのことです。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, 2006, Oracle. All rights reserved.