ヘッダーをスキップ
Oracle Application Server TopLink Mapping Workbenchユーザーズ・ガイド
10gリリース2(10.1.2)
B19120-01
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

インタフェースの使用

インタフェースは、オブジェクトの1つ以上のクラスで使用されるメソッド宣言および定数の集合です。ドメイン・クラスでは、インタフェースの実装や、既存のインタフェースの参照ができます。OracleAS TopLinkでは、次の方法でインタフェースをサポートしています。

インタフェース・ディスクリプタについて

インタフェース・ディスクリプタは、参照クラスがインタフェースであるディスクリプタです。OracleAS TopLinkで指定されている各ドメイン・クラスには、関連ディスクリプタが存在します。ディスクリプタは、オブジェクトのデータがリレーショナル・データベース内でどのように表されるかを記述するマッピングのセットです。これには、クラス・インスタンス変数から表のフィールドへのマッピング、および属性の格納および取得に必要な変換ルーチンが含まれます。ディスクリプタは、Javaオブジェクトとそのデータベース表現の間のリンクとして機能します。

インタフェースは、他のクラスが使用可能な抽象的な動作の集合です。これは純粋にJavaオブジェクトの概念で、リレーショナル・データベースでは表現されません。そのため、インタフェースに対して定義されたディスクリプタでは、データベース上のリレーショナル・エンティティはマップされません。


注意:

OracleAS TopLink Mapping Workbenchでは、インタフェース・ディスクリプタを作成または編集できません。

インタフェース・ディスクリプタで定義されるコンポーネントは、次のとおりです。

  • 記述されるJavaインタフェース

  • 実装される親インタフェース

  • 抽象問合せキーのリスト

インタフェース・ディスクリプタに関連付けられている具体的なデータまたは表が存在しないため、インタフェース・ディスクリプタではマッピングが定義されません。インタフェースに対して問合せを発行できるよう、抽象問合せキーのリストが定義されます。インタフェースに対して読取り問合せを行うと、1つ以上のインプリメンタを読み取ります。

次の図は、2つのディスクリプタによって実装される1つのインタフェースについて説明しています。

図4-28 複数クラスによるインタフェースの実装



次のコードは、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章「ディスクリプタについて」を参照してください。

インタフェースを実装するには、次の手順を実行します。

インタフェース・ディスクリプタを構成するには:

  1. 「ナビゲータ」ペインでインタフェースを選択します。

  2. 「エディタ」ペインの「インプリメンタ」タブで、このインタフェースを実装し、1つ以上の共通問合せキーを共有するディスクリプタをクリックします。

図4-29 「インプリメンタ」タブ



「共通問合せキー」領域に、インタフェースのインプリメンタに対するすべての問合せキーが表示されます。

インタフェースの単一インプリメンタとしてクラス・ディスクリプタを指定するには:

  1. 「ナビゲータ」ペインで、インタフェースの唯一のインプリメンタとなるディスクリプタを選択します。

  2. このディスクリプタに対して「インタフェース・エイリアス」詳細ディスクリプタ・プロパティが表示されない場合、「選択」メニューまたはポップアップ・メニューから「アドバンスト・プロパティの設定」「インタフェース・エイリアス」を選択し、「インタフェース・エイリアス」ページを作成します。

  3. 「インタフェース・エイリアス」ページで、このディスクリプタのエイリアスとなるインタフェースを選択します。このインタフェースは、プロジェクト内にディスクリプタを必要とせず、関連ディスクリプタが存在する場合は、削除されます。これ以後、インタフェースのすべてのインスタンスは、このクラスのインスタンスとしても利用されます。