Design do DAO

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.

@Weyne Por convenção apenas (não é obrigatório) identifique essa classe como util e separe-as em pacotes, caso não esteja.

[CODE]
public class JPAUtil {

private static final EntityManagerFactory emf;

static {
emf = Persistence.createEntityManagerFactory(“PersistenceUnitFabio”);
}

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

}

[/CODE]

1 curtida

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.

Abraços.

1 curtida

Excelente dica @nel , obrigado.

1 curtida