Classe derivata dalla T generica
-
03-07-2019 - |
Domanda
Ho un hibernate dao con parametri che esegue operazioni crud di base e quando viene parametrizzato viene utilizzato come delegato per eseguire le operazioni crud di base per un dato dao.
public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID>
Voglio essere in grado di derivare Class da T in fase di esecuzione per creare query di criteri in Hibernate, in modo tale che:
public T findByPrimaryKey(ID id) {
return (T) HibernateUtil.getSession().load(T.getClass(), id);
}
Lo so:
T.getClass()
non esiste, ma esiste un modo per derivare l'oggetto Class corretto da T in fase di esecuzione?
Ho esaminato la generica e la riflessione ma non ho trovato una soluzione adatta, forse mi manca qualcosa.
Grazie.
Soluzione
Potresti far passare la Classe come argomento del costruttore.
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;
}
// ....
}
Altri suggerimenti
C'è un modo per capire class
dell'argomento tipo T
usando reflection:
private Class<T> persistentClass = (Class<T>)
((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Ecco come 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();
}
}
Suppongo che funzioni solo quando ConcreteEntityDao
è una superclasse diretta di HibernateDao<ConcreteEntity,...>
.
L'ho trovato qui: www.greggbolinger.com/blog/2008/04/17/1208457000000.html