Galera, estou com um problemão e gostaria de uma ajuda.
Estou desenvolvendo uma aplicação com JSF, Primefaces e Hibernate. Essa aplicação possui o seguinte requisito: “Após a confirmação do primeiro pagamento de um contrato, o contrato é ativado”. Implementei um Filter para que a transação fosse iniciada a cada requisição, mas quando possuo mais de uma presistência na transação, se a segunda falhar, o sistema retorna pro filtro e executa o commit e não o rollback.
Coloco abaixo os códigos.
Filtro
package hibernate.utils;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.hibernate.SessionFactory;
public class ConexaoHibernateFilter implements Filter {
private SessionFactory sessionFactory;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain chain) throws IOException, ServletException {
sessionFactory.openSession();
try {
sessionFactory.getCurrentSession().beginTransaction();
chain.doFilter(servletRequest, servletResponse);
if (sessionFactory.getCurrentSession().getTransaction().isActive()) {
sessionFactory.getCurrentSession().getTransaction().commit();
}
} catch(Throwable ex) {
try {
if (sessionFactory.getCurrentSession().getTransaction().isActive()) {
sessionFactory.getCurrentSession().getTransaction().rollback();
}
} catch(Throwable t) {
t.printStackTrace();
}
throw new ServletException(ex);
} finally {
sessionFactory.close();
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
sessionFactory = HibernateUtil.getSessionFactory();
}
}
Método confirmarPagamento do meu ManagedBean
public void confirmarPagamento() {
try {
PagamentoProcesso pagamentoProcesso = PagamentoFactory.criarPagamentoProcesso(ContextoUtils.getParametroGlobal());
pagamentoProcesso.confirmarPagamento(this.pagamentoSelecionado);
ExibeMensagem.exibirMensagemOK("Pagamento confirmado com sucesso");
} catch(Exception e) {
ExibeMensagem.exibirMensagemErro(e.getMessage().split(System.getProperty("line.separator")));
}
}
Métodos envolvidos da minha classe PagamentoProcesso
public void confirmarPagamento(Pagamento pagamento) throws Exception {
this.pagamentoBusiness.confirmar(pagamento);
ativarContratoSeForOPrimeiroPagamento(pagamento);
if (this.envioDeEmailHabilitado) {
enviarEmailDeConfirmacaoDoPagamento(pagamento);
}
}
private void ativarContratoSeForOPrimeiroPagamento(Pagamento pagamento)
throws Exception {
// Se for o primeiro pagamento do contrato, ativa o contrato
Contrato contrato = pagamento.getContrato();
Pagamento primeiroPagamentoDoContrato = contrato.getPagamentos().get(0);
boolean ehPrimeiroPagamentoDoContrato = pagamento.equals(primeiroPagamentoDoContrato);
if (ehPrimeiroPagamentoDoContrato) {
ativarContrato(pagamento.getContrato());
}
}
private void ativarContrato(Contrato contrato) throws Exception {
ContratoProcesso contratoProcesso = ContratoFactory.criarContratoProcesso(this.parametroGlobal);
contratoProcesso.ativarContrato(contrato);
}