2

テーブル SUBCOURSE は COURSE COURSE(id, name) SUBCOURSE(id, course_id, name) を参照します

では、1:M.

Hibernate はコース用に生成します:

    @OneToMany(fetch = FetchType.LAZY、mappedBy = "コース"、カスケード = CascadeType.ALL)
    public Set getSubCourses() {
        this.subCourses を返します。
    }

生成するサブコースの場合

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "course_id", nullable = false)
    パブリックコース getCourse() {
        this.course を返します。
    }

問題は、カスケードが期待どおりに機能しないことです。SubCourse オブジェクト (Set) のコレクションを作成し、それを埋めてから、Course オブジェクトの setSubCourses() にバインドします。次に、単にコース オブジェクトを永続化します。

ただし、Subcourses テーブルに ManyToOne があるため、各オブジェクトのコレクションに追加する前に手動で setCourse() する必要があります。そうしないと、Course オブジェクトとそのコレクションを永続化するときに例外が発生します。

何をお勧めしますか?

PS または多分これはゲームの一部ですか? すべての子の親オブジェクトを手動で設定しますか?

4

2 に答える 2

6

これはゲームの一部のようです。Hibernate book からの引用 (Itemが親でBidが子である例を参照):

を呼び出すだけではanItem.getBids().add(bid)、変更は永続化されません! 反対側aBid.setItem(anItem)が正しく設定されている場合にのみ、必要なものが得られます。これは、Hibernate を使用しない Java の動作と一致しています。関連付けが双方向の場合、一方だけでなく、両側にポインターを使用してリンクを作成する必要があります。これが、次のような便利なメソッドを推奨する主な理由 です。これらのメソッドaddBid()は、コンテナ管理の関係のないシステムで双方向参照を処理します。

上記のクラスは、

public class Item {
  ...
  private Set bids = new HashSet();
  public void setBids(Set bids) {
    this.bids = bids;
  }
  public Set getBids() {
    return bids;
  }
  public void addBid(Bid bid) {
    bid.setItem(this);
    bids.add(bid);
  }
  ...
}
于 2010-04-08T20:46:17.790 に答える
0

双方向の関連付けで作業する場合、リンクの両側を正しく設定する必要があります(「1.2.6. 双方向リンクの作業」で説明されているように)。ドキュメントで提案されている防御的なアプローチをよく使用します。

多くの開発者は防御的にプログラミングし、リンク管理メソッドを作成して、両側を正しく設定します (たとえば、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 メソッドが保護されるようになりました。これにより、同じパッケージ内のクラスとサブクラスは引き続きメソッドにアクセスできますが、他のすべての人がコレクションを直接変更することはできなくなります。反対側のコレクションの手順を繰り返します。

于 2010-04-08T21:54:13.063 に答える