удаление ассоциации @ManyToMany не всегда работает в Spring Data - PullRequest
0 голосов
/ 12 октября 2019

Я новичок в данных 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 просто выбирает и не удаляет. Я пытаюсь найти в журнале, было ли это «незапланированное удаление объекта», но я не смог его найти (кстати, мне так и не удалось должным образом решить эту проблему).

Спасибо за ваше время!

1 Ответ

0 голосов
/ 14 октября 2019

Это очень хороший способ синхронизировать отношения (код и базу данных) с помощью методов добавления и удаления. Однако это означает, что вам нужны правильные методы для hashCode и equals. * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * Ниши ни. * Затем вам придется изменить классы на Role.

...