ヘッダーをスキップ

1対1マッピングの使用

1対1マッピングとは2つのJavaオブジェクト間の単純なポインタ参照のことです。Javaでは、属性に格納される単一ポインタがソース・オブジェクトとターゲット・オブジェクト間のマッピングを表します。リレーショナル・データベース表は外部キーを使用してこれらのマッピングを実装します。

図5-15は、Employeeオブジェクトのaddress属性からAddressオブジェクトへの1対1リレーションシップを示しています。データベースにこの関連を格納するには、address属性とAddressクラス間の1対1マッピングを作成します。このマッピングは、Employeeインスタンスが書き込まれるとEMPLOYEE表のAddressインスタンスのidを格納します。また、Employeeがデータベースから読み込まれるとEmployeeインスタンスをAddressインスタンスにリンクします。AddressにはEmployeeへの参照はないため、Employeeへのマッピングを提供する必要はありません。

1対1マッピングでは通常、ソース表にはターゲット表のレコードへの外部キー参照が含まれます。図5-15では、EMPLOYEE表のADDR_IDフィールドが外部キーです。

図5-15 1対1マッピング

1対1リレーションシップ

また、ターゲット表にソース表への外部キー参照が含まれる場合の1対1マッピングを実装することもできます。この例では、ADDRESS行に、所属するEmployeeを識別するEMP_IDが含まれるようにデータベースの設計が変更されます。このケースではターゲットもソースへのリレーションシップ・マッピングを保持します。

更新、挿入および削除処理は、通常ソースの前にターゲットに対して実行されますが、プライベートで所有される1対1リレーションシップの場合、ターゲットが外部キーを所有していると、逆の順序で実行されます。一方が外部キーを所有し、もう一方がそれ自体の表で同じ外部キーを共有しているため、ターゲット外部キーは、通常、双方向1対1マッピングで存在します。

ターゲット外部キーは、大きなカスケード・コンポジット主キーが存在する場合(つまり、あるオブジェクトの主キーが多数の他のオブジェクトの主キーで構成されている場合)にも発生します。このケースでは、外部キーおよびターゲット外部キーの両方を含む1対1マッピングを保持することが可能です。

外部キーでは、TopLinkは自動的にオブジェクトの行の外部キー値を更新します。ターゲット外部キーでは更新しません。TopLinkマッピング・エディタで、ターゲット外部キー関連が定義されると「ターゲット外部キー」チェック・ボックスが選択されます。

関連をマッピングする際は、関連を正しく定義するため外部キーとターゲット外部キーの違いを理解する必要があります。

関連の2つのクラスがお互いを参照する双方向の関連では、1つのマッピングのみが外部キーを保持します。もう1つのマッピングはターゲット外部キーを保持します。双方向の関連における1つのマッピングが1対多マッピングの場合の詳細は、「可変1対1マッピングの使用」を参照してください。


関連トピック

TopLinkマッピング・タイプについて
リレーションシップ・マッピングの使用

 

Javaオブジェクトの1対1マッピングの作成
CMP EJBの1対1マッピングの作成