【问题标题】:Hibernate doesn't add records to associationHibernate 不会将记录添加到关联中
【发布时间】:2023-03-14 06:30:02
【问题描述】:

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

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

编辑

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

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

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

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

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

    【讨论】:

    • 那没有帮助。没有改变。这是从休眠中调试的: 休眠:从 person_meeting 会议 0_ 内部加入会议中选择 meeting0_.person_id 作为 person1_0_1_、meeting0_.meeting_id 作为 meeting2_1_、meeting1_.meeting_id 作为 meeting1_3_0_、meeting1_.duration 作为 duration3_0_、meeting1_.meetingDate 作为 meetingD3_3_0_、meeting1_.room 作为 room3_0_ meeting1_ on meeting0_.meeting_id=meeting1_.meeting_id 其中 meeting0_.person_id=?休眠:更新会议设置持续时间=?,会议日期=?,房间=?在哪里 meeting_id=?
    • 我假设实体已附加。如果你想让这些人坚持下去,你需要拯救他们。
    • 所有 Person 对象已经在数据库中。它们是从列表中挑选出来的,因此它们处于生命周期中并且它们以 id 等形式存在
    • 我已经设法通过手动创建 2 个人员对象和 1 个会议来实现我的目标。添加所有内容并保存。但我需要通过更新来做到这一点
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      相关资源
      最近更新 更多