Hibernate 单向多对多更新目标构成关系

Posted

技术标签:

【中文标题】Hibernate 单向多对多更新目标构成关系【英文标题】:Hibernate Unidirectional ManyToMany Update Target Constituent Relation 【发布时间】:2017-02-21 20:27:11 【问题描述】:

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 的另一个自连接表,这不是预期的。

hibernate是否可以只更新Role-Privilegemant-to-many关系,其他关系不变。

Spring Data Jpa 用于数据持久化

【问题讨论】:

请添加您执行更新的方法 Spring Data Jpa 存储库用于数据持久化 【参考方案1】:

听起来您正在通过(删除旧特权和)添加新特权来更新特权。如果您这样做,显然,第二个连接表(自引用表)可以根据您传递的内容更新为新行。

我看到对于自引用表 Privilege,您没有设置级联类型。它默认为无操作,这听起来像你想要的。但我的猜测是基于您所说的“每当我在角色中设置更新的权限列表时”,这告诉我您正在为角色创建新权限,而不是使用现有权限并将它们关联与角色。

【讨论】:

谢谢它的工作,我的错误是你说的,"...updating the privileges by (removing old privileges and) adding new ones."

以上是关于Hibernate 单向多对多更新目标构成关系的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 单向/双向 多对多

hibernate多对多查询

(十三)Hibernate中的多表操作:单向多对多

Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

Hibernate:n-n关联关系

Hibernate,关系映射的多对一单向关联多对一双向关联一对一主键关联一对一外键关联多对多关系关联