[RESOLVIDO] Gerenciando o objeto EntityManager em aplicação JavaSE
3 respostas
diogozero
Olá amigos do GUJ,
Estou desenvolvendo uma aplicação JavaSE e na camada de persistência eu estou usando JPA com Hibernate.
Toda vez que eu vou persistir alguma coisa no banco eu chamo um DAO que cria o EntityManager a partir do EntityManagerFactory e utiliza ele.
Mas não sei se isso é o melhor a se fazer, acho meio desperdicio instanciar um EntityManager diferente a cada operação com o banco.
O que eu quero saber é: Qual a melhor prática nesse caso?
Instanciar apenas um EntityManager durante toda a aplicação? Se sim, como seria essa implementação?
Para fazer isto, você deve se basear em um padrão de projeto “GoF” chamado “Singleton”, que é, em suma, um conceito muito simples: ao invés de instanciar um novo objeto todas as vezes, verifique se já existe um objeto instanciado (static) e retorne o próprio. Uma dica: Não use o DAO para criar um EntityManager, implemente uma SimpleFactory que ficará responsável exclusivamente para isto.
Veja um exemplo:
publicclassConnectionFactoryimplementsSerializable{privatestaticEntityManagerFactoryemF=null;privatestaticEntityManagerem=null;publicstaticEntityManagergetEntityManager(){// atenção: exemplo simplificado, sem captura e tratamento de exceções... para compilar, será necessário tratar as exceções.// se ainda não existir um entityManagerFactory... obtém a instância e atribui ao atributo estáticoif(emF==null){emF=Persistence.createEntityManagerFactory("basicPU");}// se ainda não houver uma instância do EntityManager... cria-se uma e atribui ao atributo estáticoif(em==null){em=emF.createEntityManager();}// retorna o EntityManager... ou uma instância nova (se for a primeira chamada) ou a mesma instância (para chamadas posteriores)...returnem;}}
Uma dica: Se for possível, utilize um servidor de aplicações para gerenciar estas conexões, assim você evita problemas de concorrência e má utilização (e liberação) de recursos.