4
respostas

[Dúvida] Duvida na hora de fechar uma transação (AJUDEM PROJETO DA FACULDADE PRA ENTREGAR SEGUNDAAAAA)

Estou terminando o projeto da faculdade(pra entregar até segunda), só está faltando resolver esse problema, tenho o metodo depositar,sacar e transferir.Tem um menu pra o usuario interagir quando faço a primeira operação exemplo o deposito ele funciona ja quando vou fazer outra operação ele da que a transação está fechado oq posso fazer pra concertar esse erro?

O erro:

Exception in thread "main" java.lang.RuntimeException: Erro ao sacarjava.lang.IllegalStateException: Cannot begin Transaction on closed Session/EntityManager
    at br.com.unifacol.dizimo.model.service.ContaIgrejaService.sacar(ContaIgrejaService.java:119)
    at br.com.unifacol.dizimo.view.MenuContaIgreja.sacar(MenuContaIgreja.java:71)
    at br.com.unifacol.dizimo.view.DizimoOnline.contaIgreja(DizimoOnline.java:141)
    at br.com.unifacol.dizimo.view.DizimoOnline.contaIgreja(DizimoOnline.java:139)
    at br.com.unifacol.dizimo.view.DizimoOnline.menuIgreja(DizimoOnline.java:114)
    at br.com.unifacol.dizimo.view.DizimoOnline.dizimoOnline(DizimoOnline.java:24)
    at br.com.unifacol.dizimo.view.DizimoOnline.main(DizimoOnline.java:13)
4 respostas

O codigo:

@Override
    public void depositar(Integer numeroDaConta, Integer senha, BigDecimal valor) throws SQLException {
        try {
            ContaIgreja contaIgrejaEncontrada = buscarConta.pesquisarContaIgreja(numeroDaConta, senha);
            if (contaIgrejaEncontrada != null) {
                manager.getTransaction().begin();
                BigDecimal currentBalance = contaIgrejaEncontrada.getSaldo();
                BigDecimal newBalance = currentBalance.add(valor);
                contaIgrejaEncontrada.setSaldo(newBalance);
                manager.merge(contaIgrejaEncontrada);
                manager.flush();
                if (manager.getTransaction().isActive()) {
                    if (manager.getTransaction().getRollbackOnly()) {
                        manager.getTransaction().rollback();
                        System.out.println("Não foi possivel realizar o deposito!");
                    } else {
                        manager.getTransaction().commit();
                        System.out.println("Deposito realizado com sucesso!");
                    }
                }
            }
        } catch (Exception e) {
            System.out.println("Não  foi possivel realizar o deposito!");
        } finally {
            manager.close();
        }
    }

    @Override
    public void sacar(Integer numeroDaConta, Integer senha, BigDecimal valor) throws SQLException {
        try {
            ContaIgreja contaIgrejaEncontrada = buscarConta.pesquisarContaIgreja(numeroDaConta, senha);
            if (contaIgrejaEncontrada != null) {
                BigDecimal currentBalance = contaIgrejaEncontrada.getSaldo();
                if (valor.compareTo(BigDecimal.ZERO) < 0) {
                    throw new IllegalArgumentException("O valor do saque deve ser maior que zero");
                } else if (currentBalance.compareTo(valor) >= 0) {
                    manager.getTransaction().begin();
                    BigDecimal newBalance = currentBalance.subtract(valor);
                    contaIgrejaEncontrada.setSaldo(newBalance);
                    manager.merge(contaIgrejaEncontrada);
                    manager.flush();
                    if (manager.getTransaction().isActive()) {
                        if (manager.getTransaction().getRollbackOnly()) {
                            manager.getTransaction().rollback();
                            System.out.println("Não foi possivel realizar o saque!");
                        } else {
                            manager.getTransaction().commit();
                            System.out.println("Saque realizado com sucesso!");
                        }
                    }
                }
            }
        } catch (Exception e) {
            throw new RuntimeException("Erro ao sacar" + e);
        } finally {
            manager.close();
        }
    }
 @Override
    public void transferir(Integer numeroDaContaOrigem, Integer numeroDaContaDestino, Integer senha, BigDecimal valor) throws SQLException {
        try {
            ContaIgreja contaIgrejaEncontrada = buscarConta.pesquisarContaIgreja(numeroDaContaOrigem, senha);
            if (contaIgrejaEncontrada != null) {
                BigDecimal currentBalance = contaIgrejaEncontrada.getSaldo();
                if (valor.compareTo(BigDecimal.ZERO) <= 0) {
                    throw new IllegalArgumentException("O valor da transferencia não pode ser 0");
                } else if (currentBalance.compareTo(valor) >= 0) {
                    manager.getTransaction().begin();
                    BigDecimal newBalance = currentBalance.subtract(valor);
                    contaIgrejaEncontrada.setSaldo(newBalance);
                    manager.merge(contaIgrejaEncontrada);
                    manager.flush();
                    try {
                        ContaMembro contaMembroEncontrada = buscarConta.pesquisarContaMembroPorNumero(numeroDaContaDestino);
                        if (contaMembroEncontrada != null) {
                            contaMembroEncontrada.setSaldo(contaMembroEncontrada.getSaldo().add(valor));
                            manager.merge(contaMembroEncontrada);
                            manager.flush();
                            if (manager.getTransaction().isActive()) {
                                if (manager.getTransaction().getRollbackOnly()) {
                                    manager.getTransaction().rollback();
                                    System.out.println("Não foi possivel efetuar a transferencia");
                                } else {
                                    manager.getTransaction().commit();
                                    System.out.println("Transferencia realizada com sucesso");
                                }
                            }
                        }
                    } catch (Exception ex) {
                        throw new RuntimeException("Erro ao transferir" + ex);
                    }
                }
            }
        } finally {
            manager.close();
        }
    }

A classe JPAUtil:

public class JPAUtil {
    private static final EntityManagerFactory FACTORY = Persistence
            .createEntityManagerFactory("Dizimo_Online");

    public static EntityManager getEntityManager() {
        return FACTORY.createEntityManager();
    }
}

O metodo está sendo instanciado na classe serviço assim:

` private EntityManager manager = JPAUtil.getEntityManager();

Eu consegui resolver tirando o manager.close() ai ele funciona mas sei q precisa fechar a transação, alguem pode dar uma ajudinha aquii???

Oi Bruno!

O seu código que abre, fecha e faz commit do EntityManager não deveria estar na classe Service e sim na classe com o método main, para que o controle seja realizado corretamente, pois você terá várias operações sendo realizadas e precisa que o EntityManager seja criado no início e fechado apenas no final.