Question

J'ai un dao hibernate paramétré qui effectue les opérations de base brutes et, lorsqu'il est paramétré, il est utilisé comme délégué pour effectuer les opérations de base brutes d'un dao donné.

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

Je souhaite pouvoir dériver une classe de T lors de l'exécution pour créer des requêtes de critères dans Hibernate, telles que:

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

Je sais:

T.getClass()

n'existe pas, mais existe-t-il un moyen de dériver le bon objet de classe à partir de T au moment de l'exécution?

J'ai examiné les génériques et la réflexion, mais je n'ai pas trouvé de solution appropriée. Peut-être me manque-t-il quelque chose.

Merci.

Était-ce utile?

La solution

Vous pourriez faire passer la classe en tant qu'argument de constructeur.

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

    // ....

}

Autres conseils

Voici comment trouver class l'argument de type T en utilisant la réflexion:

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

Voici comment je l’utilise:

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

}

Je suppose que cela ne fonctionne que lorsque votre ConcreteEntityDao est une super-classe directe de HibernateDao<ConcreteEntity,...>.

Je l'ai trouvé ici: www.greggbolinger.com/blog/2008/04/17/1208457000000.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top