gpt4 book ai didi

java - Hibernate单向ManyToMany更新目标构成关系

转载 作者:行者123 更新时间:2023-12-01 08:51:27 30 4
gpt4 key购买 nike

RolePrivilege 之间存在单向 ManyToMany 映射,其中 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
}

权限

@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-Privilege一对多关系,而让其他关系不变。

Spring Data Jpa用于数据持久化

最佳答案

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

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

关于java - Hibernate单向ManyToMany更新目标构成关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42377287/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com