1

これは、公式のHibernate チュートリアルの抜粋です。

まず、Hibernate は通常の Java セマンティクスに影響を与えないことに注意してください。単方向の例で、Person と Event の間にどのようにリンクを作成したのでしょうか? Event のインスタンスを、Person のインスタンスのイベント参照のコレクションに追加します。このリンクを双方向にしたい場合は、Event のコレクションに Person 参照を追加して、反対側でも同じことを行う必要があります。この「両側にリンクを設定する」プロセスは、双方向リンクでは絶対に必要です。

多くの開発者は防御的にプログラミングし、リンク管理メソッドを作成して、両方の側を正しく設定します (たとえば、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);
}

この場合の「絶対に」とはどういう意味ですか? :

  • つまり、現在のロジック プロセスが終了するまで関係を一貫した状態に保つために推奨されますが、持続性は明らかに発生する可能性があります。
  • 反対側を設定しないと(関係を所有しないで)、永続性を厳密に作成できないという意味ですか?

つまり、私の「追加」メソッドが次の場合はどうなるでしょうか。

public void addToEvent(Event event) {
    this.getEvents().add(event);
    //event.getParticipants().add(this); without this line
} 
4

3 に答える 3

1

他の回答が指摘しているように、休止状態は通常の Java セマンティクスを壊しません。イベントのコレクションに参加者を追加しても、参加者のコレクションにイベントが透過的に追加されるわけではありません。あなたはそれを設定する責任があります。

ドキュメントによると(チュートリアルではありません):

関連付けの逆側のみに加えられた変更は保持されません。... 非反転側は、メモリ内表現をデータベースに保存するために使用されます。

これは、ドキュメントから直接のコード例Itemであり、関連付けの逆側です。

category.getItems().add(item);          // The category now "knows" about the relationship
item.getCategories().add(category);     // The item now "knows" about the relationship

session.persist(item);                   // The relationship won't be saved!
session.persist(category);               // The relationship will be saved

要約すると、ドキュメントを読んだところ、絶対に必要というわけではありませんが、逆側のエンティティを非逆側のコレクションに追加しないと、関係が保存されません。

于 2014-06-12T15:23:06.143 に答える