web-dev-qa-db-fra.com

Comment puis-je obtenir l'objet de session si j'ai le entitymanager

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?

99
storm_buster

Pour être totalement exhaustif, les choses sont différentes si vous utilisez une implémentation JPA 1.0 ou JPA 2.0.

JPA 1.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).

JPA 2.0

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);
169
Pascal Thivent

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);
37
Vladimir Ivanov

Cela expliquera mieux.

EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
4
Enio Dantas