Removing a detached instance

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?

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???

Olá Rodolfo, voce conseguiu resolver seu problema?

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!

2 curtidas

Opa Valeu !! caiu quinem uma luva !!