Derivando Classe de T Genérico

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 type; public HibernateDao(Class 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

Intereting Posts