【问题标题】:How to update link table in Hibernate ManyToMany Mapping如何更新 Hibernate ManyToMany Mapping 中的链接表
【发布时间】:2015-09-08 05:15:04
【问题描述】:

我在 data_user 表链接的数据表和用户表之间有一个 Hibernate ManyToMany 映射。现在我想更新数据表以向数据中再添加一个用户。如何更新链接表(data_user)为新用户增加一个条目?

我,先更新了用户集合:data.getUsers().add(user),然后在DAO层尝试了session.saveOrUpdate(data)。但它删除了链接表中的所有内容。


Update1:data_user(iddata_user,iddataroom,iduser) 是在数据库中手动创建的。

Update2:为数据和用户实现了哈希码和等于。

更新 3:我改为CascadeType.MERGE。这会更新我的链接表。此外,当 CascadeType 为 ALL 时,我永远不会从休眠尝试的 Data 更新 User 表。

org.hibernate.NonUniqueObjectException:一个不同的对象与 相同的标识符值已与会话关联。

PS:我对休眠很陌生。

public class Data {
    private int dataId;
    private Data parentData;
    private Set<User> users;

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "data_user", joinColumns = { @JoinColumn(name = "iddata") },
        inverseJoinColumns = { @JoinColumn(name = "iduser") })
    public Set<User> getUsers() {
        return users;
    }
    ...
}

【问题讨论】:

  • 我认为您需要向我们展示更多代码/架构。

标签: java mysql hibernate


【解决方案1】:

您需要在实体中覆盖 equals() 和 hashCode() ,否则迟早会遇到问题,请参阅 this 了解更多详细信息。

如果在覆盖 equals() 和 hashCode() 后问题仍然存在,您可以在关系的另一侧添加 mappedBy,请参阅 this 了解更多详细信息。

【讨论】:

  • 嗯,但这似乎领先了 1 或 2 步。我正在尝试先做基础知识。
  • 如果您想比较您的对象或将它们添加到 Set 或 Map,那么您必须实现 equals 和 hashCode 读取 thisthis
  • @karimmohsen 谢谢,我进步了一点。但是遇到了这个问题:org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session
  • @karimmohsen 你能帮我理解 CascadeType 吗?然后我会接受你的回答:-P
猜你喜欢
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 2013-08-22
  • 2013-02-23
  • 2016-08-17
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多