J'ai
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria( ??? ).list();
}
Comment puis-je récupérer la session si j'utilise entitymanager ou comment puis-je obtenir le résultat de mes critères détachés?
Pour être totalement exhaustif, les choses sont différentes si vous utilisez une implémentation JPA 1.0 ou JPA 2.0.
Avec JPA 1.0, vous devriez utiliser EntityManager#getDelegate()
. Mais gardez à l'esprit que le résultat de cette méthode est spécifique à l'implémentation c'est-à-dire non portable du serveur d'applications utilisant Hibernate vers le autre. Par exemple avec JBoss vous feriez:
org.hibernate.Session session = (Session) manager.getDelegate();
Mais avec GlassFish , vous devrez faire:
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
Je suis d'accord, c'est horrible, et la spécification est à blâmer ici (pas assez clair).
Avec JPA 2.0, il existe une nouvelle (et une bien meilleure solution) EntityManager#unwrap(Class<T>)
qui doit être préférée à EntityManager#getDelegate()
pour les nouvelles applications.
Donc, avec Hibernate comme implémentation JPA 2.0 (voir .15. Native Hibernate API ), vous feriez:
Session session = entityManager.unwrap(Session.class);
Voir la section " 5.1. Accès aux API Hibernate à partir de JPA" du Guide de l'utilisateur Hibernate ORM :
Session session = entityManager.unwrap(Session.class);
Cela expliquera mieux.
EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);