Removing a detached instance

4 respostas
R
public Cliente getCliente(Integer id) throws DAOException {

try {

return em.find(Cliente.class, id);

} catch (PersistenceException e) {

LOG.debug("ERRO: "+e.getMessage());

throw new DAOException(e);

}

}
public void excluir(Cliente cliente) throws DAOException {

try {

em.remove(cliente);

} catch (PersistenceException e) {

LOG.debug("ERRO: "+e.getMessage());

throw new DAOException(e);

}

}

Cliente c = cliente = cdao.getCliente( 1 );
cdao.excluir©;

ai quando vou excluir da essa exception
javax.ejb.EJBException: java.lang.IllegalArgumentException: Removing a detached instance

alguem sabe por q?

4 Respostas

R

opss…
Cliente c cliente = cdao.getCliente( 1 );

Dá essa exception pq a session do meu EntityManager ta fechada se eu peguei meu obj pelo find, não era pra ele estar atachado a sessao???

S

Olá Rodolfo, voce conseguiu resolver seu problema?

N

Olá,

sei que é bem tardio essa resposta, mas servirá para futura referência.

Para resolver essa questão faça da seguinte maneira:

public void removerObjeto(Objeto obj) {
    //Sendo 'manager' um 'javax.persistence.EntityManager'
    manager.remove(manager.getReference(Objeto.class, objeto.getId()));
}

A explicação é o seguinte, de fato, não é necessário ter o seu objeto associado à uma transação, porém, para remover um objeto (lembre-se que se trata do Hibernate, portanto, estamos removendo um objeto) é necessário ter a referência da classe, bem como da chave primária da tabela, ou seja, o ID da tabela.

Para remover um objeto temos que referenciar o mesmo, junto com o valor da sua chave. Caso queira remover o registro normalmente sem ser dessa maneira, pode-se criar um Statement através do .createQuery("DELETE FROM Tabela WHERE ");

Abs!

T

Opa Valeu !! caiu quinem uma luva !!

Criado 10 de janeiro de 2007
Ultima resposta 16 de mai. de 2013
Respostas 4
Participantes 4