Bom dia a todos, estou na dúvida sobre o design do meu DAO, meu problema era a criação do EntityManager, optei por injetar no construtor do DAO:
public VendaPorDiaDao(EntityManager entityManager) {
this.entityManager = entityManager;
}
E pra não ter q instanciar o EntityManager no meu construtor criei uma classe que faz isso:
public class CriaEntityManager {
private static EntityManager entityManager;
public static EntityManager getEntityManager(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("PersistenceUnitFabio");
if(entityManager == null){
entityManager = factory.createEntityManager();
}
return entityManager;
}
}
Dessa forma eu uso assim:
vDao = new VendaPorDiaDao(CriaEntityManager.getEntityManager());
O que vcs acham desse design? alguma sugestão de melhoria?
PS: Sou novato em design de software, por isso me desculpem se o código está muito “bizarro”, mas não vejo outra opção ser não ir errando pra conseguir fazer certo algum dia.
Estava vendo aqui e me parece ser muito simples a utilização do CDI do JavaEE, acho q vou optar por injetar essa EntityManager usando essa especificação.
Legal realmente rs, aproveitando a oportunidade… esse meu DAO está sendo usando direto pelo Controller, estava pensando em criar uma camada de negócios pra se comunicar com o Controller, e essa por sua vez, para se comunicar com o DAO, o q acha? Mesmo não tendo regras a implementar acho pode separar um pouco as responsabilidades e desacoplar o DAO do controller, é uma boa desacoplar totalmente o DAO do controller?
@Weyne se está utilizando a especificação JEE, não se dê ao trabalho de gerenciar pool de conexões, ficar abrindo e fechando conexão, transações e afins “na mão”. Permita que o container faça isso por você. Além do CDI (que tu vai utilizar @Inject e @Produces), tu pode usar a anotação @PersistentContext, podendo configurar o seu datasource no container (ou servidor de aplicação) e utilizar ele através de configuração no persistent.xml.