1 回答

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果沒有完整的代碼,很難弄清楚發(fā)生了什么。但總的來說,您應(yīng)該考慮以下概念:
帶注釋的實(shí)體JoinTable是關(guān)系的所有者。這意味著如果您啟用Cascade.Merge“Owner”,向其中添加新記錄,則會向中間表添加另一條記錄。
一個(gè)例子
Role實(shí)體:
{
@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實(shí)體:
{
@ManyToMany(mappedBy = "privileges")
private Set<Role> roles = new HashSet<Role>();
}
這里,Role是關(guān)系的所有者。當(dāng)您使用 創(chuàng)建角色對象 并使用 ,id=0填充其權(quán)限列表并ids=[0 1 2]調(diào)用 時(shí)save,它會將角色記錄插入到 中tb_role,并且還會將 (0,0)、(0,1) 和 (0,2) 插入到中間表tb_role_privilege,但它不會向 中插入任何內(nèi)容tb_privilege。因此,您需要在tb_privilege插入角色記錄之前插入權(quán)限記錄。
這是一種良好且簡單的m2m人際關(guān)系方法。如果它不滿足您的場景,請為您的代碼提供更多信息。
添加回答
舉報(bào)