Domanda

Ho un hibernate dao con parametri che esegue operazioni crud di base e quando viene parametrizzato viene utilizzato come delegato per eseguire le operazioni crud di base per un dato dao.

public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID>

Voglio essere in grado di derivare Class da T in fase di esecuzione per creare query di criteri in Hibernate, in modo tale che:

public T findByPrimaryKey(ID id) {
    return (T) HibernateUtil.getSession().load(T.getClass(), id);
}

Lo so:

T.getClass()

non esiste, ma esiste un modo per derivare l'oggetto Class corretto da T in fase di esecuzione?

Ho esaminato la generica e la riflessione ma non ho trovato una soluzione adatta, forse mi manca qualcosa.

Grazie.

È stato utile?

Soluzione

Potresti far passare la Classe come argomento del costruttore.

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

    // ....

}

Altri suggerimenti

C'è un modo per capire class dell'argomento tipo T usando reflection:

private Class<T> persistentClass = (Class<T>)
    ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];

Ecco come lo uso:

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

}

Suppongo che funzioni solo quando ConcreteEntityDao è una superclasse diretta di HibernateDao<ConcreteEntity,...>.

L'ho trovato qui: www.greggbolinger.com/blog/2008/04/17/1208457000000.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top