Comment puis-je obtenir l'objet de la session si j'ai le entitymanager
-
30-09-2019 - |
Question
J'ai
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria( ??? ).list();
}
Comment puis-je récupérer la session si je les utilise entitymanager ou comment puis-je obtenir le résultat de mon DetachedCriteria?
La solution
Pour être tout à fait exhaustif, les choses sont différentes si vous utilisez un JPA 1.0 ou une implémentation 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 de mise en œuvre à savoir non portable du serveur d'applications via Hibernate à l'autre. Par exemple avec JBoss vous feriez:
org.hibernate.Session session = (Session) manager.getDelegate();
avec GlassFish , vous auriez à 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 y a une nouvelle (et bien mieux) EntityManager#unwrap(Class<T>)
méthode qui est préférable à EntityManager#getDelegate()
pour les nouvelles applications.
avec Hibernate comme implémentation JPA 2.0 (voir 3.15 API native Mise en veille prolongée de ), vous devez faire:.
Session session = entityManager.unwrap(Session.class);
Autres conseils
Voir la section " 5.1. Mise en veille prolongée accéder aux API de JPA " dans la section Mise en veille prolongée ORM Guide de l'utilisateur :
Session session = entityManager.unwrap(Session.class);
expliquera mieux.
EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
Je travaillais dans wildfly mais j'utilisais
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
et la bonne était
org.hibernate.Session session = (Session) manager.getDelegate();