Производящий класс из универсального T
-
03-07-2019 - |
Вопрос
У меня есть параметризованный hibernate dao, который выполняет базовые операции crud, и при параметризации используется в качестве делегата для выполнения базовых операций crud для данного dao.
public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID>
Я хочу иметь возможность выводить класс из T во время выполнения для создания запросов критериев в режиме гибернации, таких, что:
public T findByPrimaryKey(ID id) {
return (T) HibernateUtil.getSession().load(T.getClass(), id);
}
Я знаю:
T.getClass()
не существует, но есть ли какой-либо способ получить правильный объект класса из T во время выполнения?
Я просмотрел дженерики и рефлексию, но не нашел подходящего решения, возможно, я что-то упускаю.
Спасибо.
Решение
Вы могли бы передать класс в качестве аргумента конструктора.
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;
}
// ....
}
Другие советы
Есть способ, как это выяснить 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