Opa! E aí pessoal!
Meu primeiro post aqui no forum.
Já agradeço a todos porque já resolvi muitos problemas com a ajuda do fórum, só vendo dúvidas já respondidas.
Bom, minha dúvida é a seguinte:
Estou fazendo um projeto em 4 camadas (Modelos, DAO, Controller e View) para Desktop.
Nas classes DAO, eu criei uma classe abstrata que cotém todos os recursos comuns as DAOs de cada modelo.
Criei nessa classe abstrata um atributo estatico EntityManagerFactory que já instanciado.
Isso é errado? Meu chefe falou pra usar uma classe singleton para gerenciar a Factory, axei desnecessário.
Se alguem puder dar opiniões, eu agradeço. Estou aprendendo ainda.
[]'s
public abstract class AbstractDAO<T> {
protected Class<T> entityClass;
private static EntityManagerFactory EMF = Persistence.createEntityManagerFactory("EleicaoUrnaPU");
public AbstractDAO(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected final EntityManager getEntityManager() {
return EMF.createEntityManager();
}
public abstract void create(T entity);
public abstract void edit(T entity) throws NonexistentEntityException, Exception;
public abstract void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException;
public T find(Integer id) {
EntityManager em = getEntityManager();
try {
return em.find(entityClass, id);
} finally {
em.close();
}
}
public List<T> findAll() {
return find(true, -1, -1);
}
public List<T> findRange(int maxResults, int firstResult) {
return find(false, maxResults, firstResult);
}
private List<T> find(boolean all, int maxResults, int firstResult) {
EntityManager em = getEntityManager();
try {
CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
Query q = em.createQuery(cq);
if (!all) {
q.setMaxResults(maxResults);
q.setFirstResult(firstResult);
}
return q.getResultList();
} finally {
em.close();
}
}
public int getCount() {
EntityManager em = getEntityManager();
try {
CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
Root<T> rt = cq.from(entityClass);
cq.select(em.getCriteriaBuilder().count(rt));
Query q = em.createQuery(cq);
return ((Long) q.getSingleResult()).intValue();
} finally {
em.close();
}
}
}