Я новичок в данных Spring, пытаюсь связать (@ManyToMany) пользователей с ролями из перечисления (Правка: я удалил перечисление, которое добавляло сложность без толку). У меня нет проблем с добавлением ролей пользователю, но удалить это гораздо сложнее.
Я много читал о лучших способах сопоставления ассоциаций @manytomany.
Мой класс пользователя:
@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@Email
private String email;
@ManyToMany(cascade = {CascadeType.MERGE})
@JoinTable (name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();
public void addRole(Role role){
this.roles.add(role);
role.getUsers().add(this);
}
public void removeRole(Role role){
this.roles.remove(role);
role.getUsers().remove(this);
}
}
Мой класс роли:
@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String designation;
@ManyToMany( mappedBy = "roles")
private Set<User> users = new HashSet<>();
public Role(String designation) {
this.designation = designation;
}
}
И мой тест:
public static void main(String[] args) {
SpringApplication.run(LibraryApiWebApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
Role user = new Role(RoleDesignation.USER);
Role admin = new Role(RoleDesignation.ADMIN);
roleRepository.save(user);
roleRepository.save(admin);
User user1 = new User("****@hotmail.fr", encoder.encode("1234"), "***", "***", user);
User user2 = new User("*****@gmail.com", encoder.encode("1234"),"****", "*****user);
user1.addRole(admin);
userRepository.save(user1);
userRepository.save(user2);
user1.removeRole(admin);
userRepository.save(user1);
user2.addRole(admin);
userRepository.save(user2);
user2.removeRole(admin);
userRepository.save(user2);
}
}
Этот работает (Edit: после очистки ассоциаций, он больше не работает):
user1.removeRole(admin);
userRepository.save(user1);
hibernate выполняет удаление
но второй нет:
user2.removeRole(admin);
userRepository.save(user2);
hibernate просто выбирает и не удаляет. Я пытаюсь найти в журнале, было ли это «незапланированное удаление объекта», но я не смог его найти (кстати, мне так и не удалось должным образом решить эту проблему).
Спасибо за ваше время!