Bom dia a minha dúvida é a seguinte, tenho uma classe cliente e uma classe contato, estes estão ligados através da forma descrita abaixo:
Cliente
@OneToMany(cascade=CascadeType.ALL,targetEntity=Contato.class,mappedBy="cliente",fetch=FetchType.EAGER)
private List<Contato> contatos=new ArrayList<Contato>();
Contato
@ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER,targetEntity=Cliente.class)
private Cliente cliente;
Até ai tudo bem ele salva, recupera tudo certinho mas quando tento remover um contato ele simplesmente nao remove, é necessário realizar a remoção manual apenas do contato ??? Pois tento fazer o seguinte:
contato = modelo2.getValue(tbContato.getSelectedRow()); // Aqui ele retorna o objeto contato que esta sendo removido, utilizo o ObjectTableModel
cliente.getContatos().remove(contato);
Quando efetuo o merge ele não deveria remover aqueles objetos que não estão ligados ao cliente ? Ou isso é assim mesmo ???
DaoCliente
em.getTransaction().begin();
em.merge(pCliente);
em.getTransaction().commit();
Umas perguntinhas…
Você verificou se o elemento chegou a ser removido da lista local do objeto?
Já tentou fazer a exclusão enquanto o objeto está managed (ou seja, após o merge)?
Da lista local foram removidos sim, então nesta situação que você comentou eu teria que tipo fazer a exclusão do contato manualmente é isso ?
O que eu estava sugerindo era testar algo mais ou menos assim:
em.getTransaction().begin();
em.merge(pCliente);
pCliente.getClientes().remove(cliente);
em.getTransaction().commit();
A propósito, agora que eu percebi uma coisa… você remove o contato do objeto cliente, mas depois faz merge em outro (pCliente) ?
Opa td certo…
Bom não sei se entendi muito bem o problema mas assim, o merge apenas atualiza então por mais que esteja com “cascade=CascadeType.ALL” acredito que não ira remover pois esta apenas alterando ou persistindo um objeto…
No delete ele excluiria as referencias mas ainda assim teria que ver se não tem validação no banco de dados…
Mas como eu disse não sei se entendi muito bem mas espero ter ajudado…
Valew!
Na verdade GomesRod é o mesmo objeto só que como recebo ele como parametro no DAO passo a chama-lo de pCliente.
Então talvez fique mais claro se disser o que quero fazer:
Então eu tenho uma tela de cadastro de cliente e nesta tela tem o cadastro de contatos também, e vamos supor que o usuario remova um contato desta lista, somente quero saber como faço para remover o contato que foi removido, lembrando que nesta tela ele pode por exemplo: cadastrar um novo contato e remover um antigo por exemplo, tudo funciona normal menos o remover contato que eu imaginava que bastaria remover ele da lista de contatos do cliente e atualizar através do merge mas desta forma não da certo.
Se tiverem alguma idéia… E agradeço pela ajuda de vocês dois desde já.
1 curtida
Agradeço aos que tentaram ajudar, e após dezenas de perguntas para o Googleraculo cheguei a uma solução, então para aqueles que podem vir a ter a mesma situação que a minha fica ai a sugestão:
Classe cliente
@OneToMany(cascade=CascadeType.ALL,targetEntity=Contato.class,mappedBy="cliente",fetch=FetchType.EAGER,orphanRemoval=true)
private List<Contato> contatos=new ArrayList<Contato>();
Classe Contato
@ManyToOne(fetch=FetchType.EAGER,targetEntity=Cliente.class)
private Cliente cliente;
Então ao colocar o orphanRemoval ele passou a tentar excluir mas gerava um violation devido a chave estrangeira, para resolver isso, bastou retirar o CascadeType.ALL da classe Contato, então sucesssooo. 8)