Derivando clase de genérico T
-
03-07-2019 - |
Pregunta
Tengo un dao de hibernación parametrizado que realiza operaciones básicas de crud, y cuando se parametriza se usa como delegado para cumplir operaciones básicas de crud para un determinado dao.
public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID>
Quiero poder derivar Class de T en tiempo de ejecución para crear consultas de criterios en Hibernate, de modo que:
public T findByPrimaryKey(ID id) {
return (T) HibernateUtil.getSession().load(T.getClass(), id);
}
Lo sé:
T.getClass()
no existe, pero ¿hay alguna forma de derivar el objeto de clase correcto de T en tiempo de ejecución?
He analizado los genéricos y la reflexión, pero no he encontrado una solución adecuada, tal vez me falta algo.
Gracias.
Solución
Podría pasar la clase como argumento de constructor.
public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID> {
private final Class<? extends T> type;
public HibernateDao(Class<? extends T> type) {
this.type = type;
}
// ....
}
Otros consejos
Existe la forma de averiguar class
el tipo de argumento T
usando la reflexión:
private Class<T> persistentClass = (Class<T>)
((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Así es como lo uso:
public class GenericDaoJPA<T> implements GenericDao<T> {
@PersistenceContext
protected EntityManager entityManager;
protected Class<T> persistentClass = figureOutPersistentClass();
private Class<T> figureOutPersistentClass() {
Class<T> clazz = (Class<T>)((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments()[0];
log.debug("persistentClass set to {}", clazz.getName());
return clazz;
}
public List<T> findAll() {
Query q = entityManager.createQuery("SELECT e FROM " + persistentClass.getSimpleName() + " e");
return (List<T>) q.getResultList();
}
}
Supongo que esto solo funciona cuando su ConcreteEntityDao
es una superclase directa de HibernateDao<ConcreteEntity,...>
.
Lo encontré aquí: www.greggbolinger.com/blog/2008/04/17/1208457000000.html