1 回答
TA贡献1898条经验 获得超8个赞
如果没有完整的代码,很难弄清楚发生了什么。但总的来说,您应该考虑以下概念:
带注释的实体JoinTable是关系的所有者。这意味着如果您启用Cascade.Merge“Owner”,向其中添加新记录,则会向中间表添加另一条记录。
一个例子
Role实体:
{
@ManyToMany(cascade = {CascadeType.MERGE})
@JoinTable(name = "tb_role_privilege",
joinColumns = @JoinColumn(name = "role_id"),
inverseJoinColumns = @JoinColumn(name = "privilege_id"))
private Set<Privilege> privileges = new HashSet<>();
}
和Privilege实体:
{
@ManyToMany(mappedBy = "privileges")
private Set<Role> roles = new HashSet<Role>();
}
这里,Role是关系的所有者。当您使用 创建角色对象 并使用 ,id=0填充其权限列表并ids=[0 1 2]调用 时save,它会将角色记录插入到 中tb_role,并且还会将 (0,0)、(0,1) 和 (0,2) 插入到中间表tb_role_privilege,但它不会向 中插入任何内容tb_privilege。因此,您需要在tb_privilege插入角色记录之前插入权限记录。
这是一种良好且简单的m2m人际关系方法。如果它不满足您的场景,请为您的代码提供更多信息。
添加回答
举报