2012-06-14 41 views
0

我有一个m: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>(); 

编号DB休眠创造了我的表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(meeting);

编辑

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

回答

2

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

所以,你需要初始化关联的另一面:

for (Participant p : set) { 
    p.getMeetings().add(saveMeeting); 
} 
+0

没有帮助。没有改变。这是从休眠调试:休眠:选择meetings0_.person_id作为person1_0_1_,meetings0_。MEETING_ID如meeting2_1_,meeting1_.meeting_id如meeting1_3_0_,meeting1_.duration如duration3_0_,meeting1_.meetingDate如meetingD3_3_0_,meeting1_.room如room3_0_从person_meeting上meetings0_.meeting_id = meeting1_.meeting_id其中meetings0_.person_id = meetings0_内加入会议meeting1_? 休眠:更新会议设定时间段= ?, meetingDate = ?,房=? meeting_id =? – Fixus

+0

我认为实体WRE连接。如果你想让这些人坚持下去,你需要保存它们。 –

+0

所有人员对象已经在数据库中。他们从名单挑选,使他们在生命周期中,他们用ID等 – Fixus

0

我已经解决了这个问题。我没有想到,所以我没有写。人是一流的,并且由另外两个人来扩展。我更改了更新操作,以便它使用了Object类的一个实例。这样我就可以更新协会