Спящий объект не удаляет отношения - PullRequest
0 голосов
/ 08 января 2019

У меня есть отношение объекта полномочий, где один пользователь может иметь несколько разрешений. Когда я пытаюсь обновить пустое значение 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 все еще имеет первоначальную длину, что означает, что никакие разрешения не были удалены.

Что я делаю неправильно или не понимаю о спящих сущностях?

Заранее спасибо.

1 Ответ

0 голосов
/ 09 января 2019

Вам необходимо добавить orphanremoval = true в ваш код.

@OneToMany(mappedBy = "user", cascade = {CascadeType.ALL}, orphanRemoval = true, fetch = FetchType.EAGER)

Для получения подробной информации, вы можете ref эту ссылку:

JPA 2.0 orphanRemoval = true VS при удалении Каскад

А также, выглядит странно, что ваш параметр объединения должен выглядеть следующим образом (первый столбец является владельцем):

@JoinTable(name = "UserPermissions",
        joinColumns = @JoinColumn(name = "PermissionId"),
        inverseJoinColumns = @JoinColumn(name = "UserId"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...