[Resolvido]Hibernate e não captura de exceção

16 respostas
B

Então, eu estou usando um DAO genérico e quando vou fazer dar o persist(), se ela já existir, bastaria somente capturar a exceção e continuar, mas ele não captura.

Tentei dar o catch em cima do persist() mas ele não captura e nem nada.

public void save(T t)  {
        logger.info("salvando: " + t);
        try{
            em.persist(t);
        }catch(org.hibernate.exception.ConstraintViolationException ex){
            ex.printStackTrace();
        }
    }
//Também tentei dar throws na exception, mas ela também não é lançada
  • Log
30502 [SwingWorker-pool-1-thread-1] WARN  org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1062, SQLState: 23000
30503 [SwingWorker-pool-1-thread-1] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Duplicate entry '079981' for key 'empenho_UNIQUE

Obrigado!

16 Respostas

R

Tente por uma exception Generica e veja se entra no catch:

public void save(T t) { logger.info("salvando: " + t); try{ em.persist(t); }catch(Exception ex){ ex.printStackTrace(); } }

B

Então, tentando capturar Exception ele capturou e printou a stackTrace, mas quando ele retorna pra outra classe da camada de persistência, a qual possui o

em.getTransaction.begin();

//salvar

em.getTransaction.commit();

No commit() gera outra exceção, estranho não?

R

Agora ponha um try-catch no commit e trate-o, verifique se resolveu seu problema.

O commit é diferente do save, ou persist, pois ele termina o fluxo de trabalho, e como deu erro no save, teoricamente o commit ira gerar uma exception.

http://www.hibernate.org/hib_docs/v3/api/org/hibernate/FlushMode.html

Hebert_Coelho

rof20004:
Agora ponha um try-catch no commit e trate-o, verifique se resolveu seu problema.

O commit é diferente do save, ou persist, pois ele termina o fluxo de trabalho, e como deu erro no save, teoricamente o commit ira gerar uma exception.

http://www.hibernate.org/hib_docs/v3/api/org/hibernate/FlushMode.html

Link quebrado. =P

R

desculpe, esse link que te passei nem existe mais, tenho alguns links antigos aqui, hehehe, ta na nora de me atualizar ‘-’.

B

Correto. Mas se eu for tratar o commit dentro do catch, como a transaction vai ser “encerrada”?

E eu estou usando entitymanager

*http://docs.jboss.org/hibernate/orm/4.1/javadocs/

Hebert_Coelho

bobleujr:
Correto. Mas se eu for tratar o commit dentro do catch, como a transaction vai ser “encerrada”?
no catch você manda um rollback e fecha a transação.

R

Acredito que se nao der erro ela vai ser encerrada normalmente, caso de algum erro, voce pode fechar manualmente =D

B

Sim, esse é o ponto, eu dei o rollback no catch, ele apontou “Transaction marked as rollBackOnly”, não há um meio de parar a transaction no braço, há?

Eu testei fechando a entity manager com EntityManager.close(), mas o desempenho vai lá em baixo

Hebert_Coelho

bobleujr:
Sim, esse é o ponto, eu dei o rollback no catch, ele apontou “Transaction marked as rollBackOnly”, não há um meio de parar a transaction no braço, há?

Eu testei fechando a entity manager com EntityManager.close(), mas o desempenho vai lá em baixo

Se já deu isso, os dados já não serão inseridos.

Agora, uma dúvida… Você está usando EJB ou Spring para gerenciar a transação?

B

Ainda não, mas acho melhor me informar sobre, haha!

Hebert_Coelho

bobleujr:
Ainda não, mas acho melhor me informar sobre, haha!
Só não entendi pq você perde performance ao fechar um entitymanager. O que acontece?

B

Por causa do delay de criação de um novo objeto. Seria como se a cada transação errada ele tivesse que criar uma nova entitymanager, a qual tem um custo alto de tempo, pelo menos pelo que pude observar até agora !

Hebert_Coelho

bobleujr:
Por causa do delay de criação de um novo objeto. Seria como se a cada transação errada ele tivesse que criar uma nova entitymanager, a qual tem um custo alto de tempo, pelo menos pelo que pude observar até agora !
Até hoje só vi esse problema quando o EntityManagerFactory é criado o tempo todo e não EntityManager… bizarro…

R

Yeah, muito estranho, nunca tive esse problema de delay ou coisa parecida.

B

Bom, mas valeu pela ajuda.

Criado 29 de janeiro de 2013
Ultima resposta 29 de jan. de 2013
Respostas 16
Participantes 3