2017-02-21 95 views
0

RolePrivilege之間的單向ManyToMany映射與Role作爲擁有實體像這樣休眠單向多對多更新目標成分關係

Role

@Entity 
public class Role extends BaseEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "role_id") 
    private Integer roleId; 
    @Size(max = 45) 
    @Column(name = "role") 
    private String role; 

    @JoinTable(name = "role_privilege", joinColumns = { 
      @JoinColumn(name = "role_role_id", referencedColumnName = "role_id")}, inverseJoinColumns = { 
      @JoinColumn(name = "privilege_privilege_id", referencedColumnName = "privilege_id")}) 
    @ManyToMany(
      cascade = { 
       CascadeType.DETACH, 
       CascadeType.MERGE, 
       CascadeType.REFRESH, 
       CascadeType.PERSIST }, fetch = FetchType.EAGER, targetEntity = Privilege.class) 
    private Collection<Privilege> privilegeCollection; 

    @Transient 
    private Collection<Privilege> parentPrivilegeCollection; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "roleId") 
    @JsonIgnore 
    private Collection<User> userCollection; 

    public Role() { 
    } 
    //getters,setter,hashcode,equals removed for brevity 
} 

Privilege

@Entity 
public class Privilege extends BaseEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "privilege_id") 
    private Integer privilegeId; 
    @Size(max = 45) 
    @Column(name = "name") 
    private String name; 
    @Size(max = 150) 
    @Column(name = "description") 
    private String description; 
    @Size(max = 45) 
    @Column(name = "friendly_name") 
    private String friendlyName; 
    @JoinTable(name = "privilege_hierachy", joinColumns = { 
      @JoinColumn(name = "parent_privilege", referencedColumnName = "privilege_id")}, inverseJoinColumns = { 
      @JoinColumn(name = "child_privilege", referencedColumnName = "privilege_id")}) 
    @ManyToMany 
    private Collection<Privilege> privilegeCollection; 

    public Privilege() { 
    } 
} 

存在的問題

每當我設置角色中的特權更新列表並進行更新時,連接表成功更新而不移除目標或擁有實體,這就是期望的結果。問題是更新它也影響另一個自我連接表Privilege調用privilege_hierachy這是不是所期望的。

休眠是否可能只更新Role - Privilege mant-to-many關係並讓其他關係不變。

春數據JPA是用於數據的持久化

+0

請添加執行更新的方法 –

+0

彈簧數據Jpa存儲庫用於數據持久性 –

回答

1

這聽起來像你被(拆除舊特權和)增加新的更新權限。如果你這樣做,顯然,第二個連接表(自引用表)可以根據你傳遞的內容用新行更新。

我看到,對於自引用表,Privilege,您沒有設置級聯類型。它默認沒有操作,這聽起來像你想要的。但我的猜測是基於你所說的「每當我設置角色的更新權限列表」,並且這告訴我你正在爲一個角色創建新的權限,而不是使用現有的權限並將它們與角色相關聯。

+0

感謝它的工作,我的錯誤是像你說的那樣,'「......通過刪除舊特權來更新特權並添加新的。「 –