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?
Oi Diego, bom dia!
Isto depende muito, mas pode-se fazer sim.
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:
public class ConnectionFactory implements Serializable {
private static EntityManagerFactory emF = null;
private static EntityManager em = null;
public static EntityManager getEntityManager() {
// 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ático
if ( emF == null ) {
emF = Persistence.createEntityManagerFactory("basicPU");
}
// se ainda não houver uma instância do EntityManager... cria-se uma e atribui ao atributo estático
if ( 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)...
return em;
}
}
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.
Aqui tem algumas dicas interessantes sobre design patterns: http://www.guj.com.br/articles/137
Abraço,
Sobre JPA com JSE, da uma olhada: utilizando-swing-com-jpahibernate
Valeu galera, clareou um bocado a minhas idéias aqui =)