¿Cómo puedo conseguir el objeto de sesión si tengo el EntityManager
-
30-09-2019 - |
Pregunta
tengo
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria( ??? ).list();
}
¿Cómo puedo recuperar la sesión si estoy usando EntityManager o cómo puedo obtener el resultado de mi DetachedCriteria?
Solución
Para ser totalmente exhaustiva, las cosas son diferentes si usted está usando un JPA 1.0 o una aplicación APP 2.0.
JPA 1.0
Con JPA 1.0, tendría que usar EntityManager#getDelegate()
. Pero hay que tener en cuenta que el resultado de este método es específico de la aplicación es decir, no portátiles de servidor de aplicaciones usando Hibernate a la otra. Por ejemplo con JBoss que haría:
org.hibernate.Session session = (Session) manager.getDelegate();
con GlassFish , que tendría que hacer:
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
Estoy de acuerdo, eso es horrible, y la especificación es el culpable aquí (no lo suficientemente claro).
JPA 2.0
Con JPA 2.0, hay una nueva (y mucho mejor) EntityManager#unwrap(Class<T>)
método que es preferible a EntityManager#getDelegate()
para nuevas aplicaciones.
Así que con Hibernate como JPA 2.0 aplicación (ver 3.15 nativo Hibernate API ), que haría:.
Session session = entityManager.unwrap(Session.class);
Otros consejos
Consulte la sección " 5.1. Acceso a Hibernate API de APP " en el Hibernate ORM Guía del usuario :
Session session = entityManager.unwrap(Session.class);
Esto explicará mejor.
EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
Yo estaba trabajando en JBoss, pero yo estaba usando
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
y la correcta era
org.hibernate.Session session = (Session) manager.getDelegate();