У меня он работает, но с собственным запросом, который затем требует 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();
}