Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Entradas duplicadas no Usuario_Roles

Olá!

Estou com um problema. Quanto eu tento fazer a atualização do usuário no banco de dados, tenho entradas duplicadas de suas roles.

  public void atualizar(Usuario usuario, ArrayList<Role> roles) {
    manager.merge(usuario);
    usuario.setRoles(roles);
  }

estou recebendo as roles no UsuárioController através da tabela de usuários que está mapeada para /usuarios e tento atualizar com o seguinte método

  @RequestMapping(value = "/atualizar" , method = RequestMethod.POST)
  public ModelAndView atualizar(String email, @RequestParam ArrayList<Role> roles, 
      RedirectAttributes redirectAttributes) {

    Usuario usuario = usuarioDao.loadUserByUsername(email);
    usuarioDao.atualizar(usuario, roles);

    String sucesso = "Permissões alteradas com sucesso!";
    redirectAttributes.addFlashAttribute("sucesso", sucesso);

    return new ModelAndView("redirect:/usuarios");
  }

Já chequei e estou recebendo a string corretamente, o hibernate que está duplicando a entrada. Para resolver esse problema já tentei:

  • atualizar o hibernate. Encontrei no SO que a versão 5.0.8 já tinha resolvido isso
  • usar set ao invés de list nos roles, para evitar a duplicação (me causou erro justamente pela tentativa de duplicar)
  • limpar a lista de roles e inserir novos roles que são os passados ao clicar em atualizar na página (apesar de realmente limpar, o hibernate simplesmente mantinha a cópia do que já tinha lá e "concatenava" (por falta de palavra melhor no momento) os valores novos.
public void limpaRoles() {
    this.roles.clear();
  }

nada funcionou e estou aqui sem ter muita noção do que fazer para resolver isso. Tentei aplicar cascades também, que apesar de não entender muito bem o que é isso (no curso de Spring ficou bem abstrato), parecia ajudar na solução em algumas sugestões no SO, mas não adiantou também.

Alguém poderia me ajudar a encontrar um caminho pra isso?

1 resposta
solução!

Percebi que na verdade a duplicação vinha do form:checkboxes. Como não encontrei nada de como resolver isso, utilizei um método privado para remover as entradas duplicadas e retorno uma lista limpa, sendo assim, resolvendo meu problema. Não me parece a forma mais elegante, mas com certeza é funcional

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software