0

多くの人が多くの会議の参加者になることができるので、私はオブジェクト (会議、人) 間に関係があります。

このように設定しました

ミーティング

    @ManyToMany(mappedBy = "meetings")
protected Set<Person> participants = new HashSet<Person>();

@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name = "person_meeting",
        joinColumns = {@JoinColumn(name = "person_id")},
        inverseJoinColumns = {@JoinColumn(name = "meeting_id")}
)
protected Set<Meeting> meetings = new HashSet<Meeting>();

Id DB hibernate は、meeting_id、person_id の 2 つのフィールドを持つテーブル meeting_participants を作成しました。かっこいい、思った通り。今問題のケース。Meeting オブジェクトを作成し、DB に保存しました。ユーザーのセットを作成するよりも、会議に追加します

this.saveMeeting.setParticipants(set);

ハイバネート表示:

Hibernate: update Meeting set duration=?, meetingDate=?, room=? where meeting_id=?

関連付けには何も追加されません。何を変更する必要がありますか?

// EDIT フィールドのミーティング定義で変更しました

@ManyToMany(mappedBy = "meetings", cascade = {CascadeType.ALL})
protected Set<Person> participants = new HashSet<Person>();

今、私はエラーが発生します

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions

この方法にあります

public static Long add(Meeting meeting) {
    SessionFactory sf = null;
    Session session = null;

    sf = HibernateUtil.getSessionFactory();
    session = sf.openSession();

    session.beginTransaction();
    try{
        session.save(meeting);
        session.getTransaction().commit();
        session.flush();
    } catch(HibernateException e){
        session.getTransaction().rollback();
        e.printStackTrace();
        return new Long(-1);
    }
    session.close();

    return meeting.getId();
}

問題の原因となっている行は次のとおりです。

session.save(会議);

編集

OK、セッションを適切に閉じました。すべてが機能しますが、新しいオブジェクトを作成している場合にのみ見つかります。関連付けを更新したいのですが、うまくいきません。そこで質問です。関連付けを更新するには??

4

2 に答える 2

2

この質問は 2 日に 1 回行われます。アソシエーションの片側を初期化し、Hibernate が無視する側を選択しました。双方向関連には、所有者側と側があります。Hibernate は所有者側のみを考慮します。そして所有者側は属性を持たない側です。mappedBy

したがって、関連付けの反対側を初期化する必要があります。

for (Participant p : set) {
    p.getMeetings().add(saveMeeting);
}
于 2012-06-14T18:18:54.827 に答える
0

私は問題を解決しました。そんなことは考えていなかったので書きませんでした。本人がトップクラスで、あと2人伸びました。Object クラスのインスタンスを取るように update アクションを変更しました。そうすれば、関連付けを更新できます

于 2012-06-14T20:18:10.900 に答える