Tenho alguns métodos que persistem objetos diferentes ao mesmo tempo e também atualiza registros em entidades diferentes, o problema está no Rollback, dependendo de onde ocorrer o erro a transação comita algumas informções.
Exem=Connection.emf.createEntityManager();em.getTransaction().begin();em.persist(venda);em.persist(financeiro);em.createQuery("UPDATE Estoque s SET s.qtd = s.qtd -1).executeUpdate();em.getTransaction().commit();
Caso ocorro um erro apenas nos objetos financeiro, o update do estoque e a as vendas sao inseridas na base de dados.
O que posso fazer para evitar que isso aconteça?
Já faço isso justamente por isso minha dúvida de o pq nao funcionar o rollback, ja que trato dentro de uma mesma transação e de um bloco try catch.
J
javaflex
O que você postou não faz isso. Posta o código correto então, pois não dá pra advinhar.
B
bruno.crr
try{em=ConnectionHib.emf.createEntityManager();em.getTransaction().begin();DatedataServer=(Date)em.createNativeQuery(ConnectionHib.SGBD.toLowerCase().equals("mysql")?"SELECT NOW()":"SELECT SYSDATE FROM DUAL").getSingleResult();recibo.setCodUsuario(codUsuario);recibo.setDocsQuitados("");recibo.setNoQuitacao(newInteger(0));em.createQuery("UPDATE Numeracao s SET s.fcNoRecibo = s.fcNoRecibo+1 WHERE s.emp= :emp ").setParameter("emp",emp.getCodigo()).executeUpdate();IntegernoRecibo=seqDAO.getLastInsertCodigo(emp.getCodigo(),"fcNoRecibo");recibo.setNoRecibo(noRecibo);em.persist(recibo);em.getTransaction().commit();}catch(Exceptione){e.printStackTrace();em.getTransaction().rollback();throwe;}finally{em.close();}
Este é um exemplo, nesse caso persisto apenas uma entidade, mas dou um update em uma entidade que controla a numeracao dos recibos, caso de algum erro no persist do recibo, a numeracao ainda assim é afetada pelo update.
J
javaflex
Afetado no banco de dados mesmo com rollback? Você debugando ele entrou no rollback?
B
bruno.crr
Sim mesmo com o rollback ele afeta na base de dados, poderia ter algo a ver com a versão do mysql que estou usando a 5.1, o autocommit do hibernate está false, ele entra no rollback e da uma exception rollbackexception.
J
javaflex
Então não deu rollback. Posta a mensagem de erro completa. Primeira vez que vejo dar erro em rollback.
Sim, debugando, ele entra no commit depois vai para o rollback(), a exceção é lançada na execução comit e não no persist.
J
javaflex
Seu reporte sobre o problema ficou confuso. Se chamar commit ele commita o que der certo se o script SQL já tiver ido pro banco. Veja se faltou executar Flush logo após cada persist. E se não me engano, tem como configurar auto flush.
B
bruno.crr
Eu não executo flush após cada persist, mas fiz para testar e o mesmo erro persiste, uma parte da instrução sql ainda é gravado no banco.
J
javaflex
Esse problema vai acontecer enquanto tiver algo pendente na sessão do hibernate para enviar ao banco. Hibernate é uma bomba mesmo, vai se acostumado.