Очистить отношения ManyToMany с JPA / JPQL - PullRequest
0 голосов
/ 05 августа 2020

У меня есть пользователи и роли. И у каждого пользователя может быть много ролей.

Я хочу выполнить массовую операцию, например удалить все роли пользователей, но сохранить пользователей и роли. Итак, как я могу усечь только таблицу manyToMany? 1008 *

Я пробовал это, но получаю исключение. Не поддерживается для операций DML [UPDATE users.entity.User u SET u.roles = null]

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

У меня он работает, но с собственным запросом, который затем требует entityManager.clear, если я хочу использовать его в той же транзакции.

    @Modifying
    @Query(nativeQuery = true, value = "DELETE FROM user_role")
    void clearAllRoleRelations();

  @Autowired
  private EntityManager entityManager;
    

  @Test
    public void clearAllRoleRelations() {

        //given
        Role roleIn = new Role();
        roleIn.setId(27L);

        User userIn = new User();
        userIn.Id(12L);

        //do
        roleIn = rolesRepository.save(roleIn);
        userIn = usersRepository.save(userIn);
        userIn.getRoles().add(roleIn);
        usersRepository.save(userIn);

        //verify
        usersRepository.clearAllRoleRelations();

        //important within the same transaction (native query)
        entityManager.clear();

        Optional<User> userOut = usersRepository.findById(userIn.getId());
        assertThat(userOut.isPresent()).isTrue();
        assertThat(userOut.get()).isEqualTo(userIn);
        assertThat(userOut.get().getRoles()).isEmpty();
    }
0 голосов
/ 06 августа 2020

Откажитесь от @ManyToMany и создайте enitity для таблицы соединений. Таким образом, вы получите полный контроль над удалением.

...