休眠实体不删除关系
Posted
技术标签:
【中文标题】休眠实体不删除关系【英文标题】:Hibernate entity not deleting relations 【发布时间】:2019-01-08 20:41:40 【问题描述】:我有一个权限实体关系,其中一个用户可以拥有多个权限。当我尝试向用户更新一个空白的set
时,更新没有发生。
我的实体
@Entity
public class Users
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String clientId;
private String userName;
private String userStatus;
@ManyToOne(cascade = CascadeType.MERGE, CascadeType.PERSIST, fetch = FetchType.EAGER)
private Users parentUserId;
@Builder.Default
@OneToMany(mappedBy = "parentUserId", fetch = FetchType.EAGER)
private Set<Users> children = new HashSet<>();
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Builder.Default
private Set<AccessMapping> permissions = new HashSet<>();
private Long updatedAt;
@Entity
public class AccessMapping
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinTable(name = "FeatureGroupPermissions",
joinColumns = @JoinColumn(name = "FeatureGroupId"),
inverseJoinColumns = @JoinColumn(name = "PermissionId"))
private FeatureGroups featureGroup;
@ManyToOne
@JoinTable(name = "UserPermissions",
joinColumns = @JoinColumn(name = "UserId"),
inverseJoinColumns = @JoinColumn(name = "PermissionId"))
private Users user;
private String accessType;
private Long updatedAt;
一个用户拥有多个功能组的权限。
权限hashSet的大小相当于一个用户拥有的权限数。如果我想删除用户的所有权限,我将设置一个空白的 hashSet 并使用 EntityManager.merge()
函数更新用户。但这不起作用。权限仍然存在,当我获取用户时,hashSet 仍然是原始长度,这意味着没有删除任何权限。
我做错了什么或不了解休眠实体?
提前致谢。
【问题讨论】:
您是否尝试过在集合上使用 clear() 而不是设置新的 HashSet? 能把修改权限的代码贴出来吗? 【参考方案1】:您需要在代码中添加 orphanremoval=true。
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
详情可以参考这个链接:
JPA 2.0 orphanRemoval=true VS on delete Cascade
而且,你的可连接设置看起来很奇怪,它应该是这样的(第一列是拥有方):
@JoinTable(name = "UserPermissions",
joinColumns = @JoinColumn(name = "PermissionId"),
inverseJoinColumns = @JoinColumn(name = "UserId"))
【讨论】:
以上是关于休眠实体不删除关系的主要内容,如果未能解决你的问题,请参考以下文章