Problemas ao remover um Entity com o metodo remove do JPA

5 respostas
R

Pessoal estou tentando rodar o exemplo simples de JSF com EJB3 e JPA(Implementação do Hibernate) no Glassfish, consigo realizar consultas com o metodo find, inserção com o persist, porem nao consigo remover com o metodo remove, toda vez que tento da o seguinte erro:

Ele fica reclamando de:
Caused by: java.lang.IllegalArgumentException: Removing a detached instance

Já tentei usar o merge para funcionar mais naum adianta, eu uso o find para recuperar o entity endereco e o objeto obtido com o find eu repasso para o remove.

já pesquisei na net mais não encontrei a solução, se alguem já tiver tido esse problema ou souber da solução agradeço, pois não sei mais o que tentar?

5 Respostas

K
Caused by: java.lang.IllegalArgumentException: Removing a detached instance

Vamos lá

Object c=em.merge(objeto)
em.remove(c);

:wink:

M

procure entender os estados de uma entidade gerenciada pelo EntityManager.
A maioria dos erros é porque o desenvolvedor não sabe o que é uma entidade detached ou managed…

R

kartler valeu pela ajuda deu certo, porém gostaria de saber pq um objeto que é recuperado com o metodo find fica detached?

Pois no meu codigo estava assim:

Endereco endereco = this.enderecoSessionFacadeLocal.findByPrimaryKey(new Integer(2));
this.enderecoSessionFacadeLocal.remove(endereco);

em findByPrimaryKey uso o find e em remove uso o remove

até onde sei não tem motivos para ele ficar detached, lembrando que esses codigos estão dentro de um managed bean do JSF.

Agradeço desde já se puderem explicar.

K

rafaelmeireles:

Vamos lá
view plaincopy to clipboardprint?

  1. Object c=em.merge(objeto)
  2. em.remove©;

kartler valeu pela ajuda deu certo, porém gostaria de saber pq um objeto que é recuperado com o metodo find fica detached?

Pois no meu codigo estava assim:

Endereco endereco = this.enderecoSessionFacadeLocal.findByPrimaryKey(new Integer(2));
this.enderecoSessionFacadeLocal.remove(endereco);

em findByPrimaryKey uso o find e em remove uso o remove

até onde sei não tem motivos para ele ficar detached, lembrando que esses codigos estão dentro de um managed bean do JSF.

Agradeço desde já se puderem explicar.

Muito provável seu EM de onde você retirou o objeto já ter sido fechado (Isso tira o objeto do contexto de persistencia), isso torna objeto detached… por isso ao você “Amarrar” novamente o seu objeto ao EM ele se torna reattach, executando assim em.remove(o) com sucesso.

R

isso eu já entendi, o que não entendi ainda é como funciona a politica para o fechamento do EntityManager, eu suspeito que como é via servidor de aplicação o Contexto de Persistencia tem escopo de transação, ai vem a pergunta, quando eu realizo um find ele conta isso como transação e ao final do find ele é fechado?

Criado 13 de setembro de 2007
Ultima resposta 13 de set. de 2007
Respostas 5
Participantes 3