Hibernate多对多关系

时间:2015-09-24 18:49:39

标签: java mysql hibernate

我尝试使用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;

和类Node:

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

当我尝试将新节点保存到DB(已经有用户)时,它成功地将新实体添加到节点&#34; table,但是关系表&#34; users_nodes&#34;是空的。

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

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

感谢您的帮助!

1 个答案:

答案 0 :(得分: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);
    }
  }
}

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