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

Erro de RollbackException

Como posso pegar o erro caso o autor esteja vinculado a um livro. Não caiu no catch da classe autorBean, mesmo dando a mensagem no console de RollbackException

Classe AutorBean

    @Transacional
    public void removeAutor(Autor autor) {
        try {
            this.dao.remove(autor);
            mensagem = "Autor removido com sucesso";
            tipoErro = FacesMessage.SEVERITY_INFO;
        } catch (Exception e) {

            mensagem = "Não é possível excluir autor com um livro vinculado";
            tipoErro = FacesMessage.SEVERITY_ERROR;
        }

        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(tipoErro, 
                mensagem, ""));


    }
@Transacional
@Interceptor
public class GerenciadorDeTransacao implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    private EntityManager em;
    private EntityTransaction transaction;

    @AroundInvoke
    public Object gerenciaTransacao(InvocationContext context) throws Exception {

        Object resultado = null;

        try {
            //pega a transação    
            transaction = em.getTransaction();
            // abre transacao
            transaction.begin();
            // "prossegue" com o método interceptado. 
            resultado = context.proceed();
            // commita a transacao
            transaction.commit();

        } catch (Exception e) {
            //verifica se a transação esta nula ou ativa
            if(transaction != null && transaction.isActive()){
                transaction.rollback();
            }
            throw e;
        }

        return resultado;
    }

}
3 respostas
solução!

Hm... é pq a exception ta estourando depois que já passou pelo seu método do bean, lá no interceptor. Aqui, a melhor solução, é que você faça uma querie verificando se o autor ta associado ou não.. no fim é uma validação de negócio, então fica mais expressivo se ela estiver clara no seu código... uma rollbackexception pode acontecer por outros motivos...

Entendi Alberto, realmente faz sentido! Obrigado

Caso alguém um dia precise, a validação ficou desta forma. =)

Na classe AutorBean

    // Removendo Autor do Banco
    @Transacional // significa que este metodo esta vinculado a classe do pacote tx
    public void removeAutor(Autor autor) {

        List<Livro> verificaAutor = this.dao.verificaRemocaoAutor(autor.getId());

        if (verificaAutor.size() == 0) {
            this.dao.remove(autor);
            mensagem = "Autor removido com sucesso";
            tipoErro = FacesMessage.SEVERITY_INFO;
        } else {
            mensagem = "Não é possível excluir autor com um livro vinculado";
            tipoErro = FacesMessage.SEVERITY_ERROR;
        }
        context.addMessage(null, new FacesMessage(tipoErro, mensagem, ""));
    }

Classe DAO

    public List<Livro> verificaRemocaoAutor(Integer autorId) {
        List<Livro> resultList = em.createQuery("select l from Livro l join l.autores a where a.id = :pAutorId ", Livro.class).setParameter("pAutorId", autorId).getResultList();

        return resultList;
    }