1.2.6. 双方向リンクを機能させる
最初に、Hibernate は通常の Java のセマンティクスに影響を与えないことを念頭に置いてください。単方向の例ではどのように
Person と Event 間のリンクを作成したでしょうか。Event のインスタンスを Person のインスタンスであるイベントの参照のコレクションに追加しました。 このリンクを双方向にする場合は、逆側で同様の処理を行うため、 Person の参照を Event のコレクションに追加します。 このように 「両側でリンクを設定」 するプロセスは双方向リンクでは絶対に必要となります。
両側を正しく設定するため、 開発者の多くは保守的にプログラムを作成し、リンク管理メソッドを作成します (
Person 内など)。
protected Set getEvents() {
return events;
}
protected void setEvents(Set events) {
this.events = events;
}
public void addToEvent(Event event) {
this.getEvents().add(event);
event.getParticipants().add(this);
}
public void removeFromEvent(Event event) {
this.getEvents().remove(event);
event.getParticipants().remove(this);
}
これでコレクションの get および set メソッドが保護されました。 これにより、 同じパッケージやサブクラスのクラスがメソッドへアクセスできるようにし、 それ以外のクラスが直接コレクションを変更できないようにします。 コレクションに対するこの手順を逆側でも行います。
inverse マッピング属性はどうするのでしょうか。 双方向リンクは Java にとって両側で参照を正しく設定することでしかありません。 しかし、 Hibernate は SQ Lの INSERT ステートメントと UPDATE ステートメントを正しく手配するための十分な情報を持っていません (制約違反を防ぐため)。 片側を関連付けるため、 逆側の「ミラー」として考慮するよう inverse は Hibernate に伝えます。 方向性ナビゲーションモデルを SQL データベーススキーマに変換する際に Hibernate が問題を解決するにはこれのみが必要となります。 ルールは明確です。 すべての双方向関連は片側を inverse とする必要があります。一対多関連では多の側を inverse とし、 多対多関連ではどちらかを inverse とする必要があります。