Hibernate problemas com delete

3 respostas
J

Bom dia a todos.

Estou com problemas quando tento excluir algum objeto após ter salvo ou alterado algum coisa antes!

o erro que esta acontecendo é:

Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [Objeto#18]

Sei que é problema com a sessão, que provavelmente o mesmo objeto esteja em alguma outra sessão. Só nao sei como resolver.

Segue meus códigos para salvar e deleter

public Object salvar(Object objeto) throws Exception {
        try {
            session = ConexaoManager.instance().getSession();
            tx = session.beginTransaction();
            Object obj = session.merge(objeto);
            session.merge(this.getLog(obj, Monitoramento.INSERTORUPDATE)); // Gera log da operação
            tx.commit();
            return obj;
        } catch (PersistentException ex) {
            tx.rollback();
            ex.printStackTrace();
            throw new Exception(ex);
        } finally {
//            session.flush();
//            session.close();
        }
    }
public void excluir(Object objeto) throws Exception {
        try {
            session = ConexaoManager.instance().getSession();
            session.evict(objeto); // remove objeto da cache
            tx = session.beginTransaction();
            session.delete(objeto);
            session.merge(this.getLog(objeto, Monitoramento.DELETE)); // Gera log da operação
            tx.commit();
        } catch (PersistentException ex) {
            tx.rollback();
            ex.printStackTrace();
            throw new Exception(ex);
        } finally {
//            session.flush();
//            session.close();
        }
    }

Ja tentei fechar a sessao após cada operacao de gravacao, exclusão e até mesmo em meus filtros, mas mesmo assim nao deu certo!

Se alguém puder me ajudar!

Júlio

3 Respostas

L

tente session.flush; depois session.clear antes da operação!

Jonatas_Emidio_de_So

Não tenho certeza se é por causa disso, mas :

método salvar :

  • Você declara o “objeto” que recebe o merge e depois registra log de sessão com o “obj” tenta fazer os dois com o “objeto”.

método excluir:

  • neste caso você deleta o objeto e depois tenta registrar o log dele… será que isso funciona?

OBS :

  • o session.flush() sincroniza o objeto persistente onde deve ficar antes do commit;
  • uma hora a sessão tem que fechar.
  • continue buscando resolver o erro sem comentar esses caras;
  • Só para teste experimente tirar os métodos de registros de log.
J

Olá … Obrigado a ajuda de todos.

Estou fechando a sessão após cada operaçao. E tb coloquei apenas o session.flush() antes do commit. Pelos meus testes esta tudo ok!

Jonatas: No metodo salvar nao posso registrar o log da operacao com o “objeto” pois o mesmo na caso de salvar um novo registro, nao possui o codigo. por isso salvo o log com o retorno do merge!

Quanto aos logs estão funcionando sim. Testei sem eles e o mesmo problema ocorreu!

Obrigado a todos.

Att,
Júlio

Criado 13 de novembro de 2009
Ultima resposta 13 de nov. de 2009
Respostas 3
Participantes 3