java - persistencecontext - ¿Cómo puedo obtener el objeto de sesión si tengo el entitymanager?
jpa java (3)
Consulte la sección " 5.1. Acceso a las API de Hibernate desde JPA " en la Guía del usuario de Hibernate ORM :
Session session = entityManager.unwrap(Session.class);
yo 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 mis criterios separados?
Esto explicará mejor.
EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
Para ser totalmente exhaustivo, las cosas son diferentes si está utilizando una implementación de JPA 1.0 o JPA 2.0.
JPA 1.0
Con JPA 1.0, tendría que usar EntityManager#getDelegate()
. Pero tenga en cuenta que el resultado de este método es específico de implementación, es decir, no es portátil desde el servidor de aplicaciones que usa Hibernate al otro. Por ejemplo, con JBoss harías:
org.hibernate.Session session = (Session) manager.getDelegate();
Pero con GlassFish , tendrías que hacer:
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
Estoy de acuerdo, eso es horrible, y la especificación tiene la culpa aquí (no lo suficientemente clara).
JPA 2.0
Con JPA 2.0, hay un nuevo (y mucho mejor) EntityManager#unwrap(Class<T>)
que se prefiere sobre EntityManager#getDelegate()
para nuevas aplicaciones.
Entonces, con Hibernate como implementación de JPA 2.0 (ver 3.15. Native Hibernate API ), harías:
Session session = entityManager.unwrap(Session.class);