0

我有:n 关系 beetwen 对象(会议、人员),因为许多人可以参加许多会议。

我已经这样设置了

会议

    @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_participants:meeting_id、person_id。酷,正如我所愿。现在有问题的案例。我创建了会议对象并将其保存到数据库。比我创建一组用户,我将它添加到会议中

this.saveMeeting.setParticipants(set);

休眠显示:

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

没有任何东西添加到关联中。我需要改变什么?

// 编辑我已经更改了字段的会议定义

@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(会议);

编辑

好的,我已经正确关闭了会话。一切正常,但只有在我创建新对象时才能找到。当我想更新关联时,它不起作用。所以问题是。如何更新关联?

4

2 回答 2

2

这个问题每两天问一次。您刚刚初始化了关联的一侧,而您选择了 Hibernate 忽略的一侧。双向关联具有所有者方和方。Hibernate 只考虑所有者方。而所有者方是没有mappedBy属性的一方。

所以需要初始化关联的另一端:

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

我已经解决了这个问题。我没有考虑这个,所以我没有写它。Person 是一个顶级类,它被另外两个扩展。我已经更改了更新操作,以便它采用 Object 类的实例。这样我就可以更新关联

于 2012-06-14T20:18:10.900 回答