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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top