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