Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Código que vai e volta :)

Na para 04 da aula 04, Melhorando o código do DAO, foi mostrado que o código repetido "cheira mal" (como diria o Nico). Muito bem, a seguir o instrutor "carrega" o código que faz referência a banco de dados para a classe MovimentacaoDao, estabelece os respectivos métodos, verifica novamente que ainda temos a repetição do código, e recorre à Injeção de Dependências para delegar o EntityManager para quem utiliza o DAO. Até aqui foi possível entender as motivações. Acontece que a seguir o código do EntityManager que havia sido removido das classes de teste, TestaMediaDiariaProjecao e TestaSomaMovimentacoes volta exatamente igual para as mesmas classes.Neste contexto, em um projeto mais mundo real, qual seria a melhor abordagem para tratar do EntityManager? Uma classe implementando o padrão Singleton faria sentido para conter o EntityManager para todo o projeto? Obrigado.

1 resposta
solução!

Olá Marcelo, tudo bem? Peço desculpas pela demora no retorno! Nesse caso, falando sobre um problema simples seguindo essa abordagem do curso, seria interessante criar uma classe que tenha uma fábrica, no caso EntityManagerFactory, e que seja estática assim teremos apenas uma fábrica para todo o projeto, e também só precisarmos fechá-la uma vez, essa classe pode sempre nos devolver um EntityManager para que possamos trabalhar com ele, assim poderia ter uma classe com o nome de JPAUtil e ele poderia ficar dentro do pacote util do projeto, seguindo essa ideia poderíamos ter a seguinte classe:

package br.com.alura.jpa.util;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class JPAUtil {

    private static EntityManagerFactory factory =
            Persistence.createEntityManagerFactory("alura");

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

Pronto assim, podemos usar em qualquer classe de teste, um exemplo usando a classe TestaSomaDasMovimentacoes:

package br.com.alura.jpa.testes;

import br.com.alura.jpa.modelo.dao.MovimentacaoDao;
import br.com.alura.jpa.util.JPAUtil;

import javax.persistence.EntityManager;

public class TestaSomaDasMovimentacoes {
    public static void main(String[] args) {
        EntityManager em = new JPAUtil().getEntityManager();

        MovimentacaoDao dao = new MovimentacaoDao(em);

        System.out.println("A soma das movimentacoes é: " + dao.getSomaDasMovimentacoes());
    }
}

Porém se formos trabalhar em uma aplicação web usando algum framework como Spring, uma ideia melhor ainda seria usar o PersistenceContext.

Espero ter esclarecido sua dúvida!