この章では、リレーショナル可変1対1マッピングを使用するために構成する必要がある様々なコンポーネントについて説明します。
この章の内容は次のとおりです。
複数のマッピング・タイプに共通のTopLinkマッピング・オプションを構成する方法の詳細は、第121章「マッピングの構成」を参照してください。
TopLinkマッピングの作成方法の詳細は、第120章「マッピングの作成」を参照してください。
表32-1は、リレーショナル可変1対1マッピングの構成可能オプションを示します。
表32-1は、リレーショナル可変1対1マッピングの構成可能オプションを示します。
表32-1 リレーショナル可変1対1マッピングの構成可能オプション
オプション | Oracle JDeveloper |
TopLink Workbench |
Java |
---|---|---|---|
|
|||
121.6項「マッピング・レベルでのメソッドまたは直接フィールド・アクセスの構成」 |
|||
|
|||
121.7項「プライベート・リレーションシップまたは独立したリレーションシップの構成」 |
|||
|
|||
|
|||
|
|||
|
|||
|
例32-1は、Javaコードによる可変1対1マッピングの作成方法とディスクリプタへの追加方法を示します。
例32-1 可変1対1マッピング
public void customize(ClassDescriptor descriptor) { VariableOneToOneMapping mapping = new VariableOneToOneMapping(); // configure mapping ... // add mapping to descriptor descriptor.addMapping(mapping); }
詳細は、次を参照してください。
可変1対1マッピングでは、図32-1に示されるように、ソース表のインジケータ列を使用して正しいターゲット表を指定できます。この項では、クラス・インジケータの実装について説明します。
ソース表には、クラス・インジケータ・フィールドを介してターゲット表を指定するインジケータ列があります。
図32-1は、行のターゲット(PHONE
またはEMAIL
のいずれか)を示すTYPE
列を持つEMPLOYEE
表を示します。
このような可変クラスのリレーションシップを定義する方針は、通常の1対1リレーションシップの定義と類似していますが、次の点が異なります。
参照クラスはJavaインタフェースであり、Javaクラスではありません。ただし、インタフェースの設定方法はまったく同じです。
タイプ・インジケータ・フィールドを指定する必要があります。
マッピングにより作成するオブジェクトのクラスを判別できるように、マッピングに対してクラス・インジケータ値を指定します。
外部キー名およびそれぞれの抽象問合せキーを、ターゲット・インタフェース・ディスクリプタから指定する必要があります。
あるいは、一意の主キーを使用して正しいターゲットを指定できます。詳細は、32.3項「一意の主キーの構成」を参照してください。
可変1対1マッピングにクラス・インジケータを指定するには、次の手順を実行します。
ナビゲータで可変1対1マッピングを選択します。その属性がエディタに表示されます。
「クラス・インジケータ情報」タブをクリックします。「クラス・インジケータ情報」タブが表示されます。
「クラス・インジケータ・フィールド」を使用して、可変マッピングのインジケータとして使用する、(マッピングのディスクリプタに関連付けられた)データベース表のフィールドを選択します。
「インジケータ・タイプ」でリストからデータ・タイプを選択して、クラス・インジケータのデータ・タイプを指定します。
各(非抽象)子クラスに特定のクラス・インジケータ・フィールド値を指定するには、「編集」をクリックして、各子クラスに適切な値を入力します。
例32-2は、Javaコードでクラス(タイプ)インジケータを使用した可変1対1マッピングの定義方法を示します。
例32-2 クラス・インジケータを使用した可変1対1マッピングの定義
public void customize(ClassDescriptor descriptor) { VariableOneToOneMapping variableOneToOneMapping = new VariableOneToOneMapping(); variableOneToOneMapping.setAttributeName("contact"); variableOneToOneMapping.setReferenceClass (Contact.class); variableOneToOneMapping.setForeignQueryKeyName ("C_ID", "id"); variableOneToOneMapping.setTypeFieldName("TYPE"); // configure class indicators variableOneToOneMapping.addClassIndicator(Email.class, "Email"); variableOneToOneMapping.addClassIndicator(Phone.class, "Phone"); variableOneToOneMapping.dontUseIndirection(); variableOneToOneMapping.privateOwnedRelationship(); // add mapping to descriptor descriptor.addMapping(variableOneToOneMapping); }
VariableOneToOneMapping
で使用可能なメソッドの詳細は、『Oracle Fusion Middleware Java API Reference for Oracle TopLink』を参照してください。
可変1対1マッピングでは、図32-4に示されるように、ソース表の一意の主キーを使用して正しいターゲット表を指定できます。この項では、クラス・インジケータの実装について説明します。
あるいは、クラス・インジケータを使用して正しいターゲットを指定できます。詳細は、32.2項「クラス・インジケータの構成」を参照してください。
主キーを使用して可変1対1マッピングを指定するには、次の手順を実行します。
ナビゲータで可変1対1マッピングを選択します。その属性がエディタに表示されます。
「クラス・インジケータ情報」タブをクリックします。「クラス・インジケータ情報」タブが表示されます。
「クラス・インジケータ・フィールド」を使用して、「何も選択されていません」を選択します。
「インジケータ・タイプ」を使用して、「何も選択されていません」を選択します。
「インジケータ値」列には何も指定しません。
マッピングの参照ディスクリプタを選択した後、「インクルード」チェック・ボックスの選択を解除します。
注意: ソース表の外部キー値が一意でない場合は、「クラス・インジケータ・フィールド」の値を選択解除できません。 |
例32-3は、Javaコードで一意の主キーを使用した可変1対1マッピングの定義方法を示します。
例32-3 一意の主キーを使用した可変1対1マッピングの定義
public void customize(ClassDescriptor descriptor) {
VariableOneToOneMapping variableOneToOneMapping =
new VariableOneToOneMapping();
variableOneToOneMapping.setAttributeName("contact");
variableOneToOneMapping.setReferenceClass(Contact.class);
variableOneToOneMapping.setForeignQueryKeyName("C_ID", "id");
variableOneToOneMapping.dontUseIndirection();
variableOneToOneMapping.privateOwnedRelationship();
// add mapping to descriptor
descriptor.addMapping(variableOneToOneMapping);
}
VariableOneToOneMapping
で使用可能なメソッドの詳細は、『Oracle Fusion Middleware Java API Reference for Oracle TopLink』を参照してください。
図32-4に示されるように、ターゲット表の主キーにマップされるソース表の外部キーの値(C_ID
)は一意です。複数のターゲット表の中で同一の主キー値はありません。このため、主キー値は1つの表の中のみで一意なのではなく、複数の表の中でも一意です。
ソース表に格納されているインジケータがない場合、TopLinkでは外部キー値がマップされるターゲット表を特定できません。このため、TopLinkはターゲット表のどれかにエントリが見つかるまで、すべてのターゲット表を読み取ります。これは、非効率的なリレーション・モデルの設定方法です。クラス・インジケータは、データを取得するために表で実行される読取り数を削減するため、非常に効率的です。クラス・インジケータ方法では、TopLinkはデータ検索のためにどのターゲット表を調べるかを正確に特定します。
このような可変クラスのリレーションシップを定義する方針は、クラス・インジケータ可変1対1リレーションシップの定義と類似していますが、次の点が異なります。
タイプ・インジケータ・フィールドが指定されません。
クラス・インジケータ値が指定されません。
TopLinkは最終的にデータが検索されるまで、すべてのターゲット表を検索するため、タイプ・インジケータ・フィールドおよびその値は必要ではありません。
この項では、Javaなどの開発ツールを使用した、問合せキー関連付けの構成について説明します。
可変1対1マッピングに使用する問合せキーを指定するには、次の手順を実行します。
ナビゲータで可変1対1マッピングを選択します。その属性がエディタに表示されます。
「問合せキー・アソシエーション」タブをクリックします。「問合せキー・アソシエーション」タブが表示されます。
次の情報を参照し、タブの各フィールドにデータを入力します。
「インジケータ・タイプ」でリストからデータ・タイプを選択して、クラス・インジケータのデータ・タイプを指定します。
フィールド | 説明 |
---|---|
外部キー | このリレーションシップで外部キーとして使用するデータベース表のフィールド。 |
問合せキー名 | この関連付けでの(参照ディスクリプタからの)問合せキーの名前。詳細は、119.10項「問合せキーの構成」を参照してください。 |