Получение класса из общего T
У меня есть параметризованный hibernate dao, который выполняет основные операции crud, и когда параметризованный используется в качестве делегата для выполнения основных операций crud для заданного dao.
public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID>
Я хочу иметь возможность выводить класс из T во время выполнения для создания запросов критериев в Hibernate, так что:
public T findByPrimaryKey(ID id) {
return (T) HibernateUtil.getSession().load(T.getClass(), id);
}
Я знаю:
T.getClass()
не существует, но есть ли способ получить правильный объект класса из T во время выполнения?
Я посмотрел на дженерики и размышления, но не нашел подходящего решения, возможно, я чего-то не хватает.
Спасибо.
Ответы
Ответ 1
Вы могли бы передать класс как аргумент конструктора.
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;
}
// ....
}
Ответ 2
Существует способ определения class
аргумента типа T
с использованием отражения:
private Class<T> persistentClass = (Class<T>)
((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Вот как я его использую:
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();
}
}
Я предполагаю, что это работает только тогда, когда ваш ConcreteEntityDao
является прямым суперклассом HibernateDao<ConcreteEntity,...>
.
Я нашел его здесь: www.greggbolinger.com/blog/2008/04/17/1208457000000.html