Estou tentando remover uma entidade Empresa através do método remove e está dando o seguinte erro:
Exception in thread "main" java.lang.IllegalArgumentException: Removing a detached instance model.Empresa#6
at org.hibernate.ejb.event.EJB3DeleteEventListener.performDetachedEntityDeletionCheck(EJB3DeleteEventListener.java:67)
at org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:107)
at org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:74)
at org.hibernate.internal.SessionImpl.fireDelete(SessionImpl.java:956)
at org.hibernate.internal.SessionImpl.delete(SessionImpl.java:935)
at org.hibernate.ejb.AbstractEntityManagerImpl.remove(AbstractEntityManagerImpl.java:905)
at dao.EmpresaDao.delete(EmpresaDao.java:73)
at br.com.engeselt.devmanager.Main.main(Main.java:28)
Método delete:
public void delete(Empresa empresa) {
super.openTransaction();
super.manager.remove(empresa);
super.closeIfOpened();
}
Já tentei usando find, merge, getReference e nenhum funcionou então fiz uma verificação pra ver se a entidade estava realmente no contexto da transação usando:
super.manager.find(Empresa.class, empresa.getCodEmpresa());
if (super.manager.contains(empresa)) {
super.manager.remove(empresa);
}
e não entrou no método remove…
estou sem recursos :?
PS: métodos que abrem e fecham a transação:
protected void openTransaction() {
openManager();
if (!manager.getTransaction().isActive()) {
manager.getTransaction().begin();
}
}
protected void openManager(){
if (!manager.isOpen()){
manager = factory.createEntityManager();
}
}
protected void closeIfOpened() {
if (manager.isOpen()) {
manager.close();
}
}
Edit: Desculpa o topico duplo, Deu erro no navegador e achei que não tinha enviado
Solução: Simplesmente faltava o commit apos dar o comando remove (ngm viu :roll: )
public void delete(Empresa empresa) {
super.openTransaction();
super.manager.remove(super.manager.getReference(Empresa.class, empresa.getCodEmpresa()));
super.manager.getTransaction().commit();
super.closeIfOpened();
}