【问题标题】:Hibernate Many-to-Many relation休眠多对多关系
【发布时间】:2015-12-22 11:50:28
【问题描述】:

我正在尝试使用 Hibernate 和 MySQL DB 实现多对多关系。 我有班级用户:

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "users_nodes",
            joinColumns = {@JoinColumn(name = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "node_id")})
private List<Node> nodeList;

和类节点:

@ManyToMany(mappedBy = "nodeList", cascade = CascadeType.ALL)
private List<User> users;

当我尝试将新节点保存到数据库(其中已经有用户)时,它成功地将新实体添加到“节点”表,但关系表“用户节点”为空。

这是我保存节点实体的方式:

@Override @Transactional
public void persist(Node entity) {
    getCurrentSession().save(entity);
}

感谢您的帮助!

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

    您必须更新关联的所有者方 (User.nodeList),这意味着您必须将每个关联用户的 UserNode 关联。例如:

    class Node {
      ...
      public void addUser(User user) {
        if (!users.contains(user)) {
          users.add(user);
          user.addNode(this);
        }
      }
    }
    
    class User {
      ...
      public void addNode(Node node) {
        if (!nodeList.contains(node)) {
          nodeList.add(node);
          node.addUser(this);
        }
      }
    }
    

    如果这是一个性能问题(如果 Users 有很多 Nodes,因此在将新节点与所需用户关联时将它们全部加载会很昂贵),您可以更改映射以便 @987654328 @ 是该协会的所有者和/或您可以考虑描述here 的其他选项和改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 2011-12-31
      相关资源
      最近更新 更多