【问题标题】: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?
  • 能把修改权限的代码贴出来吗?

标签: java hibernate jpa


【解决方案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"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多