Classe dérivée du générique T
-
03-07-2019 - |
Question
J'ai un dao hibernate paramétré qui effectue les opérations de base brutes et, lorsqu'il est paramétré, il est utilisé comme délégué pour effectuer les opérations de base brutes d'un dao donné.
public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID>
Je souhaite pouvoir dériver une classe de T lors de l'exécution pour créer des requêtes de critères dans Hibernate, telles que:
public T findByPrimaryKey(ID id) {
return (T) HibernateUtil.getSession().load(T.getClass(), id);
}
Je sais:
T.getClass()
n'existe pas, mais existe-t-il un moyen de dériver le bon objet de classe à partir de T au moment de l'exécution?
J'ai examiné les génériques et la réflexion, mais je n'ai pas trouvé de solution appropriée. Peut-être me manque-t-il quelque chose.
Merci.
La solution
Vous pourriez faire passer la classe en tant qu'argument de constructeur.
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;
}
// ....
}
Autres conseils
Voici comment trouver class
l'argument de type T
en utilisant la réflexion:
private Class<T> persistentClass = (Class<T>)
((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Voici comment je l’utilise:
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();
}
}
Je suppose que cela ne fonctionne que lorsque votre ConcreteEntityDao
est une super-classe directe de HibernateDao<ConcreteEntity,...>
.
Je l'ai trouvé ici: www.greggbolinger.com/blog/2008/04/17/1208457000000.html