3 回答

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊
關(guān)系的所有權(quán)取決于將“ mappedBy”屬性放置在注釋中的位置。您放置“ mappedBy”的實(shí)體不是所有者。雙方都沒有機(jī)會成為所有者。如果您沒有“刪除用戶”用例,則可以簡單地將所有權(quán)移至Group實(shí)體,因?yàn)楫?dāng)前User是所有者。
另一方面,您沒有問過這個(gè)問題,但是有一件事值得知道。的groups和users不與彼此組合。我的意思是,從Group1.users中刪除User1實(shí)例后,User1.groups集合不會自動(dòng)更改(這對我來說很令人驚訝),
總而言之,我建議您確定誰是所有者。假設(shè)User是所有者。然后,在刪除用戶時(shí),關(guān)系用戶組將自動(dòng)更新。但是,在刪除組時(shí),您必須像這樣刪除自己的關(guān)系:
entityManager.remove(group)
for (User user : group.users) {
user.groups.remove(group);
}
...
// then merge() and flush()

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊
以下對我有用。將以下方法添加到不是關(guān)系(組)所有者的實(shí)體
@PreRemove
private void removeGroupsFromUsers() {
for (User u : users) {
u.getGroups().remove(this);
}
}
請記住,要使此功能起作用,組必須具有更新的用戶列表(不會自動(dòng)完成)。因此,每次將“網(wǎng)上論壇”添加到“用戶”實(shí)體中的群組列表時(shí),也應(yīng)將“用戶”添加到“群組”實(shí)體中的用戶列表中。

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
我找到了可能的解決方案,但是...我不知道這是否是一個(gè)好的解決方案。
@Entity
public class Role extends Identifiable {
@ManyToMany(cascade ={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinTable(name="Role_Permission",
joinColumns=@JoinColumn(name="Role_id"),
inverseJoinColumns=@JoinColumn(name="Permission_id")
)
public List<Permission> getPermissions() {
return permissions;
}
public void setPermissions(List<Permission> permissions) {
this.permissions = permissions;
}
}
@Entity
public class Permission extends Identifiable {
@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinTable(name="Role_Permission",
joinColumns=@JoinColumn(name="Permission_id"),
inverseJoinColumns=@JoinColumn(name="Role_id")
)
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
我已經(jīng)嘗試過了,并且有效。刪除角色時(shí),關(guān)系也將被刪除(但不刪除Permission實(shí)體);刪除權(quán)限時(shí),與角色的關(guān)系也將被刪除(但不刪除Role實(shí)例)。但是我們兩次映射單向關(guān)系,并且兩個(gè)實(shí)體都是該關(guān)系的所有者。這會導(dǎo)致一些問題休眠嗎?哪種類型的問題?
添加回答
舉報(bào)