1.2.2. 単方向 Set ベース関連
イベントのコレクションを
Person
クラスに追加すると、 Person#getEvents
を呼び出して明示的なクエリを実行しなくても特定の人物に対するイベントを簡単にナビゲートすることができます。 複数値の関連は、 Java コレクションフレームワークのコントラクトの 1 つによって示されます。 この例ではコレクションに重複する要素がなく、 順序付けは関係ないため、 java.util.Set
を選択しています。
public class Person { private Set events = new HashSet(); public Set getEvents() { return events; } public void setEvents(Set events) { this.events = events; } }
この関連をマッピングする前に、 逆側を考慮してみましょう。 両方向よりナビゲート可能にしたい場合は、 このまま単方向にするか
Event
上に別のコレクションを作成することができます。 しかし、 機能的な観点から見ると、 これは必要ではありません。 明示的なクエリを実行して常に特定イベントの参加者を読み取ることができます。 これは設計者が自由に選択することができますが、 関連の多重度については明確です。 両側に 「多く」 の値があることを 「多対多」 関連と呼びます。 そのため、 Hibernate の多対多マッピングを使用します。
<class name="Person" table="PERSON"> <id name="id" column="PERSON_ID"> <generator class="native"/> </id> <property name="age"/> <property name="firstname"/> <property name="lastname"/> <set name="events" table="PERSON_EVENT"> <key column="PERSON_ID"/> <many-to-many column="EVENT_ID" class="Event"/> </set> </class>
Hibernate は多様なコレクションマッピングをサポートしていますが、 最も一般的なのが
set
です。 多対多関連 (または n:m エンティティリレーションシップ) には、 関連テーブルが必要です。 このテーブルの各行は、 人物とイベント間のリンクを表します。 テーブル名は set
要素の table
属性を使用して宣言されます。 関連の識別子列名は、 人物側では key
要素、 イベント側では many-to-many
の column
属性で定義されます。 Hibernate にコレクションにおけるオブジェクトのクラス (参照コレクションの逆側のクラス) を伝える必要もあります。
このマッピングのデータベーススキーマは以下のようになります。
_____________ __________________ | | | | _____________ | EVENTS | | PERSON_EVENT | | | |_____________| |__________________| | PERSON | | | | | |_____________| | *EVENT_ID | <--> | *EVENT_ID | | | | EVENT_DATE | | *PERSON_ID | <--> | *PERSON_ID | | TITLE | |__________________| | AGE | |_____________| | FIRSTNAME | | LASTNAME | |_____________|