java - 休眠实体不删除关系
问题描述
我有一个权限实体关系,其中一个用户可以拥有多个权限。当我尝试向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 仍然是原始长度,这意味着没有删除任何权限。
我在做什么错或不了解休眠实体?
提前致谢。
解决方案
您需要在代码中添加 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"))
推荐阅读
- python - 如何为所有 Django 字段添加额外的关键字参数?
- python - 为什么代码无法识别分配的变量?
- r - 我可以将曲线趋势线添加到每列只有一个数据点的 ggplot 吗?
- android - 将对称密钥导入 Android Keystore(外部生成的密钥)
- c# - Wpf 共享图像内存
- javascript - 如何获得带有垂直子图的分组箱线图
- r - 在 R 中创建比例图
- c# - 使用 Razor Pages 中的约定按区域按不同方案进行授权
- javascript - 顺序 Api 调用多个 url
- java - 有没有办法在 HTML 代码不公开的页面上使用 Selenium?