Derivando Classe de T genérico
-
03-07-2019 - |
Pergunta
Eu tenho um dao hibernação parametrizada que executa básico operações CRUD, e quando parametrizado é usado como um delegado para cumprir operações básicas CRUD para um determinado dao.
public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID>
Eu quero ser capaz de derivar da classe de T em tempo de execução para criar critérios de consultas em Hibernate, de tal forma 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 obter o objeto de classe correta do T em tempo de execução?
Eu olhei genéricos e reflexão, mas não vêm-se com uma solução adequada, talvez eu estou faltando alguma coisa.
Graças.
Solução
Você poderia ter a classe passada como um argumento construtor.
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;
}
// ....
}
Outras dicas
Não é a maneira como descobrir class
do tipo T
argumento usando a reflexão:
private Class<T> persistentClass = (Class<T>)
((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Aqui é a maneira como eu usá-lo:
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();
}
}
Suponho que isto só funciona quando o seu ConcreteEntityDao
é uma superclasse direta de HibernateDao<ConcreteEntity,...>
.
Eu encontrei-o aqui: www.greggbolinger.com/blog/2008/04/17/1208457000000.html