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

EntityManager não está fechando com o close

Eu estava testando o entity manager separado em uma classe conforme a terceira aula:

public class JPAUtil {

    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("financas");

    public EntityManager getEntityManager() {
         return emf.createEntityManager();
    }

}

Mas quando eu fui tentar fazer um teste e um close:

        EntityManager em = new JPAUtil().getEntityManager();

        em.getTransaction().begin();
        conta = em.find(Conta.class, 1);

 //       em.persist(conta);
        em.remove(conta);
        em.getTransaction().commit();

        em.close();

Eu reparei que a aplicação no eclipse continuou rodando, coisa que não acontecia quando eu separava EntityManagerFactory e o EntityManager e fazia close nos dois:

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("financas");


        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();

        Conta conta = em.find(Conta.class, 2);

        System.out.println(conta.getTitular());

        em.getTransaction().commit();
        em.close();
        emf.close();

Como eu faço para fechar de maneira correta usando a minha classe JPAUtil ?

2 respostas
solução!

De inicio você pode adicionar um método na JPAUtil para fechar o EntityManagerFactory.

Mas em um projeto mais avançado , digamos assim , o EntityManager e/ou EntityManagerFactory seriam gerenciados pelo conteiner com @PersistenceContext e @PersistenceUnit

Ou seria gerenciado com o auxílio de injeção de dependência como CDI ou Spring.

Que ficariam encarregados com o ciclo de vida , desde a criação até o encerramento desses objetos.

Como sugerido, criei um método separado na classe apenas para fazer o close, depois quando eu aprender o conteiner que você citou, faço de uma maneira diferente. Obrigado pela ajuda!