Comment puis-je obtenir l’object de session si j’ai le gestionnaire de l’entité

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.

JPA 1.0

Avec JPA 1.0, vous devez 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’application utilisant Hibernate à l’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 les spécifications sont à blâmer ici (pas assez claires).

JPA 2.0

Avec JPA 2.0, il existe une nouvelle méthode (et bien meilleure) EntityManager#unwrap(Class) qui doit être préférée à EntityManager#getDelegate() pour les nouvelles applications.

Donc, avec Hibernate comme implémentation JPA 2.0 (voir 3.15. Native Hibernate API ), vous feriez:

 Session session = entityManager.unwrap(Session.class); 

Reportez-vous à 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);