第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

如何在JPA中刪除具有ManyToMany關(guān)系的實(shí)體(以及相應(yīng)的聯(lián)接表行)?

如何在JPA中刪除具有ManyToMany關(guān)系的實(shí)體(以及相應(yīng)的聯(lián)接表行)?

牧羊人nacy 2019-12-12 14:48:18
假設(shè)我有兩個(gè)實(shí)體:“組”和“用戶”。每個(gè)用戶可以是多個(gè)組的成員,每個(gè)組可以有多個(gè)用戶。@Entitypublic class User {    @ManyToMany    Set<Group> groups;    //...}@Entitypublic class Group {    @ManyToMany(mappedBy="groups")    Set<User> users;    //...}現(xiàn)在,我要?jiǎng)h除一個(gè)組(假設(shè)它有很多成員)。問題是,當(dāng)我在某個(gè)組上調(diào)用EntityManager.remove()時(shí),JPA提供程序(在我的情況下為Hibernate)不會從聯(lián)接表中刪除行,并且由于外鍵約束,刪除操作也會失敗。在User上調(diào)用remove()可以正常工作(我想這與擁有關(guān)系的一方有關(guān))。那么在這種情況下如何刪除組?我想出的唯一方法是加載組中的所有用戶,然后為每個(gè)用戶從其組中刪除當(dāng)前組并更新用戶。但是,對于該組中的每個(gè)用戶調(diào)用update()只是為了能夠刪除該組,這似乎很荒謬。
查看完整描述

3 回答

?
絕地?zé)o雙

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()


查看完整回答
反對 回復(fù) 2019-12-12
?
慕森卡

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í)體中的用戶列表中。


查看完整回答
反對 回復(fù) 2019-12-12
?
收到一只叮咚

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)致一些問題休眠嗎?哪種類型的問題?


查看完整回答
反對 回復(fù) 2019-12-12
  • 3 回答
  • 0 關(guān)注
  • 1092 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號