Eu tenho um dao de hibernação parametrizado que executa operações crud básicas, e quando parametrizado é usado como um delegado para realizar operações crud básicas para um dado dao.
public class HibernateDao implements GenericDao
Eu quero ser capaz de derivar class de T em tempo de execução para criar consultas de critérios no Hibernate, de modo que:
public T findByPrimaryKey(ID id) { return (T) HibernateUtil.getSession().load(T.getClass(), id); }
Eu sei:
T.getClass()
não existe, mas existe alguma maneira de derivar o object de class correto de T em tempo de execução?
Eu olhei para genéricos e reflection, mas não encontrei uma solução adequada, talvez eu esteja perdendo alguma coisa.
Obrigado.
Você poderia ter a class passada como um argumento de construtor.
public class HibernateDao implements GenericDao { private final Class extends T> type; public HibernateDao(Class extends T> type) { this.type = type; } // .... }
Existe a maneira de descobrir a class
do tipo argumento T
usando reflection:
private Class persistentClass = (Class ) ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Aqui está a maneira como eu uso:
public class GenericDaoJPA implements GenericDao { @PersistenceContext protected EntityManager entityManager; protected Class persistentClass = figureOutPersistentClass(); private Class figureOutPersistentClass() { Class clazz = (Class )((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments()[0]; log.debug("persistentClass set to {}", clazz.getName()); return clazz; } public List findAll() { Query q = entityManager.createQuery("SELECT e FROM " + persistentClass.getSimpleName() + " e"); return (List ) q.getResultList(); } }
Suponho que isso só funciona quando o seu ConcreteEntityDao
é uma superclass direta do HibernateDao
.
Eu encontrei aqui: http://www.greggbolinger.com/blog/2008/04/17/1208457000000.html