sexta-feira, 7 de novembro de 2008

DAO Factory Genérico EJB3

Pessoal,

Como dito pelo excelente post do meu amigo Ricardo Ferreira em http://architecture-journal.blogspot.com/2007/07/enterprise-java-beans-30-anti-patterns.html não é uma boa prática termos todos os DAOs controlados pelo EJB apenas para podermos injetar o EntityManager.

Então fiz um DAOFactory bem genérico que serve muito bem aos meus propósitos, mas que pode ajudar quem quer criar uma factory para EJB3. Para se buscar o DAO, deve-se então injetar o DaoFactory e utilizar o método getDAO passando como argumento a classe persistente a ser utilizada.

Segue abaixo a classe:

@Stateless
@SuppressWarnings("unchecked")
public class DAOFactory implements DaoFactoryLocal {

@PersistenceContext(unitName = "BioModel")
private EntityManager em;

private final static String POS_FIXO_DAO = "DAO";
private final static String PACOTE_ENTIDADE = ".entidade.";
private final static String PACOTE_DAO = ".dao.";

private static String getDAOName(Class classeEntidade) {
String resultado = classeEntidade.getName().replace(PACOTE_ENTIDADE,
PACOTE_DAO);
resultado = resultado.concat(POS_FIXO_DAO);


return resultado;
}

@Override
public GenericDAOImpl getDAO(Class classeEntidade) {

GenericDAOImpl result = null;

try {
result = (GenericDAOImpl) Class.forName(getDAOName(classeEntidade))
.newInstance();
result.setEntityManager(em);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}


return result;
}

}



Segue abaixo um exemplo de sua utilização:

@EJB
private DaoFactoryLocal daoFactory;

@SuppressWarnings("unchecked")
protected GenericDAOImpl getDAO() {
return daoFactory.getDAO(classePersistente);

}


Qualquer problema me avisem.

Nenhum comentário: