インタフェースは、オブジェクトの1つ以上のクラスで使用されるメソッド宣言および定数の集合です。ドメイン・クラスでは、インタフェースの実装や、既存のインタフェースの参照ができます。OracleAS TopLinkでは、次の方法でインタフェースをサポートしています。
可変クラス・リレーションシップでは、ドメイン・オブジェクトが、別のドメイン・オブジェクトまたは特定のインタフェースを実装するオブジェクトの集合を参照します。
インタフェースの問合せに、読取り問合せを発行できます。
インタフェース・ディスクリプタは、参照クラスがインタフェースであるディスクリプタです。OracleAS TopLinkで指定されている各ドメイン・クラスには、関連ディスクリプタが存在します。ディスクリプタは、オブジェクトのデータがリレーショナル・データベース内でどのように表されるかを記述するマッピングのセットです。これには、クラス・インスタンス変数から表のフィールドへのマッピング、および属性の格納および取得に必要な変換ルーチンが含まれます。ディスクリプタは、Javaオブジェクトとそのデータベース表現の間のリンクとして機能します。
インタフェースは、他のクラスが使用可能な抽象的な動作の集合です。これは純粋にJavaオブジェクトの概念で、リレーショナル・データベースでは表現されません。そのため、インタフェースに対して定義されたディスクリプタでは、データベース上のリレーショナル・エンティティはマップされません。
|
注意: OracleAS TopLink Mapping Workbenchでは、インタフェース・ディスクリプタを作成または編集できません。 |
インタフェース・ディスクリプタで定義されるコンポーネントは、次のとおりです。
記述されるJavaインタフェース
実装される親インタフェース
抽象問合せキーのリスト
インタフェース・ディスクリプタに関連付けられている具体的なデータまたは表が存在しないため、インタフェース・ディスクリプタではマッピングが定義されません。インタフェースに対して問合せを発行できるよう、抽象問合せキーのリストが定義されます。インタフェースに対して読取り問合せを行うと、1つ以上のインプリメンタを読み取ります。
次の図は、2つのディスクリプタによって実装される1つのインタフェースについて説明しています。
次のコードは、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);
ドメイン・オブジェクトのインタフェースのみが参照できるアプリケーションに、単一インプリメンタ・インタフェースを使用します。各ドメイン・クラスに一意のインタフェースが存在し、他のドメイン・クラスはこのインタフェースを実装しません。また、他のドメイン・オブジェクトへの参照もインタフェースを介して行います。
そのようなアプリケーションでは、インタフェースごとにディスクリプタを定義することは非効率的で、不要な場合があります。OracleAS TopLinkでは、そのようなインタフェースに対してディスクリプタを定義することは強制されません。ディスクリプタはドメイン・クラスに対して定義され、親インタフェースが通常どおり設定されます。
ディスクリプタの初期化の際に、インタフェースにはインプリメンタのディスクリプタが指定されます。このプロセスにより、ドメイン・クラスとそのインタフェースの両方での問合せが可能になります。唯一の制限は、各インタフェースに一意のインプリメンタが必要であることです。つまり、インプリメンタが複数でなければ、1つのインタフェースに1つのディスクリプタは必要ありません。
複数のインプリメンタを持つインタフェースを参照する1対1マッピングは、可変1対1マッピングと呼ばれます。詳細は、第6章「リレーションシップ・マッピングについて」および第4章「ディスクリプタについて」を参照してください。
インタフェースを実装するには、次の手順を実行します。
インタフェース・ディスクリプタを構成するには:
「共通問合せキー」領域に、インタフェースのインプリメンタに対するすべての問合せキーが表示されます。
インタフェースの単一インプリメンタとしてクラス・ディスクリプタを指定するには:
「ナビゲータ」ペインで、インタフェースの唯一のインプリメンタとなるディスクリプタを選択します。
このディスクリプタに対して「インタフェース・エイリアス」詳細ディスクリプタ・プロパティが表示されない場合、「選択」メニューまたはポップアップ・メニューから「アドバンスト・プロパティの設定」→「インタフェース・エイリアス」を選択し、「インタフェース・エイリアス」ページを作成します。
「インタフェース・エイリアス」ページで、このディスクリプタのエイリアスとなるインタフェースを選択します。このインタフェースは、プロジェクト内にディスクリプタを必要とせず、関連ディスクリプタが存在する場合は、削除されます。これ以後、インタフェースのすべてのインスタンスは、このクラスのインスタンスとしても利用されます。