Frage

Ich habe eine parametrisierte Hibernate dao, die grundlegende CRUD-Operationen durchführt, und wenn parametrisierte als Delegierter werden grundlegende CRUD-Operationen für eine bestimmte dao zu erfüllen.

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

Ich möchte in der Lage sein, Klasse zur Laufzeit von T abzuleiten Kriterien Abfragen in Hibernate zu erstellen, so dass:

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

Ich weiß:

T.getClass()

nicht existiert, aber ist es eine Möglichkeit, das richtige Klasse Objekt von T zur Laufzeit abzuleiten?

Ich habe bei Generika und Reflexion aussah, aber haben nicht mit einer geeigneten Lösung kommen, vielleicht ich bin etwas fehlt.

Danke.

War es hilfreich?

Lösung

Sie könnten die Klasse als Konstruktor Argument übergeben haben.

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

    // ....

}

Andere Tipps

Es ist die Art und Weise, wie class vom Typ Argument T, um herauszufinden, Reflexion mit:

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

Hier ist die Art und Weise, wie ich es verwenden:

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

}

Ich nehme an, dies funktioniert nur, wenn Ihr ConcreteEntityDao eine direkte Ober von HibernateDao<ConcreteEntity,...> ist.

Ich habe es hier gefunden: www.greggbolinger.com/blog/2008/04/17/1208457000000.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top