Как при обновлении данных пользователя в БД старые роли заменить новыми?

Объект User имеет отношение OneToMany к объекту Role.

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "username", nullable = false)
    private String username;

    @Column(name = "password", nullable = false)
    private String password;

    @OneToMany(mappedBy = "userId", cascade = CascadeType.ALL)
    private List<Role> roles;

    public User() {}

    public User(Long id, String username, String password, List<Role> roles) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.roles = roles;
    }

    public User(Long id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }
}

Объект Role имеет отношение ManyToOne к объекту User.

@Entity
@Table(name = "roles")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id", referencedColumnName = "id", nullable = false)
    private User userId;

    @Column(name = "role_name", nullable = false)
    private String roleName;

    public Role() {}

    public Role(Long id, User userId, String roleName) {
        this.id = id;
        this.userId = userId;
        this.roleName = roleName;
    }
}

Теперь, когда я пытаюсь ОБНОВИТЬ существующие данные польхователя путём

userRepository.save(new User(existingId, newUsername, newPassword, newRoles));

то username и password, успешно обновляются, но с ролями пользователя дела обстоят иначе. Существующие роли этого пользователя не заменяются новыми, а наоборот добавляются к существующим.

Говоря простыми словами, я хочу, чтобы при ОБНОВЛЕНИИ данных пользователя новые роли удалялись и заменялись новыми.

Можно ли получить этот эффект, например, изменив CascadeType или прочими простыми элегантными способами?


Ответы (0 шт):