Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Curso de JSF III

Bom dia! No curso de JSF III foi criado o gerenciador de transações. Ele não contempla, se eu estiver certo, quando uma transação der erro. Eu alterei o método e queria saber se está correto, se não há nada que desabone-o. Eu testei na aplicação e funcionou.

@Transacional
@Interceptor
public class GerenciadorDeTransacoes implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    EntityManager manager;

    @AroundInvoke
    public Object executaTX(InvocationContext context) throws Exception {
        Object resultado = null;
        try{
            manager.getTransaction().begin();
            resultado = context.proceed();
            manager.getTransaction().commit();
        }catch(Exception e){
            if (manager.isOpen()){
                manager.getTransaction().rollback();
            }
        return resultado;
        }
        return resultado;    
    }
}
7 respostas

Fala aí Adauto blz?

Cara seu método esta bem OK, no meu ponto de vista.

Só queria entender uma coisa no seu catch, nele você está verificando se a conexão esta aberta (manager.isOpen()), é isso mesmo que você gostaria de validar? Ou você gostaria de validar se ainda está em transação (manager.getTransaction().isActive()) para então fazer o rollback?

Um outro ponto a se levar em conta, é que qualquer RuntimeException (excessões não checadas) causam rollback e excessões checadas não causa rolback.

Espero ter ajudado!

Tudo bem Fernando?

O isOpen foi apenas vicio do Delphi. Entendo então que neste caso pertence a RuntimeException e não seria necessário o try catch certo?

Digamos que não ficaria incompleto o código se eu deixar sem o try catch?

Valeu!

Tudo bem Adauto quanto tempo hein, rs

Então seria necessário sim, nesse caso você está tratando a exception dessa forma ela não vai chegar no framework (Hibernate por exemplo) para ele efetuar o rollback.

Acho que poderia alterar para verificar se a transação está aberta (ao invés de verificar se a conexão está aberta) antes de você efetuar o rollback.

Oi Fernando,

a ocorrência de um erro na operação com o banco de dados lança uma exceção, seria muito difícil "cercar o galo", ou seja, saber todas as exceções que podem ser lançadas neste caso e tratá-las, então como "Exception" não decende de RuntimeException, eu preciso tratá-la ok? Eu ouvi num vídeo certa vez que mexeu com banco de dados precisa try catch!

Falei algo errado?

Valeu!!!

solução!

Fala aí Adauto,

Falou certinho,

Mas uma operação com banco de dados pode gerar diversas exceptions, porém creio que elas sejam filhas das seguintes exceptions

http://docs.oracle.com/javaee/7/api/javax/persistence/PersistenceException.html

https://docs.oracle.com/javase/7/docs/api/java/sql/SQLException.html

Caramba Fernando, é coisa para caramba!!! Valeu cara pelas informações!!!

Opa, precisando manda aí!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software