Класс получения от Generic T - PullRequest
       49

Класс получения от Generic T

11 голосов
/ 29 апреля 2009

У меня есть параметризованный спящий режим dao, который выполняет базовые операции crud, а при параметризации используется как делегат для выполнения основных операций crud для данного дао.

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()

не существует, но есть ли способ извлечь правильный объект Class из T во время выполнения?

Я смотрел на дженерики и рефлексию, но не нашел подходящего решения, возможно, я что-то упустил.

Спасибо.

Ответы [ 2 ]

17 голосов
/ 29 апреля 2009

Вы можете передать класс в качестве аргумента конструктора.

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;
    }

    // ....

}
7 голосов
/ 20 мая 2009

Есть способ, как выяснить 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...