¿Cómo puedo obtener el objeto de sesión si tengo el administrador de entidad?

107

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?

Storm_buster
fuente
Véase también((EntityManagerImpl)em).getSession();
ashley

Respuestas:

181

Para ser totalmente exhaustivo, las cosas son diferentes si está utilizando una implementación JPA 1.0 o JPA 2.0.

JPA 1.0

Con JPA 1.0, tendrías que usar EntityManager#getDelegate(). Pero tenga en cuenta que el resultado de este método es específico de la implementación, es decir, no portátil del servidor de aplicaciones que usa Hibernate al otro. Por ejemplo, con JBoss haría:

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 es la culpable aquí (no lo suficientemente clara).

JPA 2.0

Con JPA 2.0, hay un EntityManager#unwrap(Class<T>)método nuevo (y mucho mejor) que es preferible EntityManager#getDelegate()a las aplicaciones nuevas.

Entonces, con Hibernate como implementación JPA 2.0 (ver 3.15. API de Hibernate nativa ), harías:

Session session = entityManager.unwrap(Session.class);
Pascal Thivent
fuente
1
entityManager.unwrap(Session.class);lo que es Sessionen Session.class? ¿es una importación?
Thang Pham
Depende de la implementación de JPA, si está utilizando eclipselink, esorg.eclipse.persistence.sessions.Session
albciff
41

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);
Vladimir Ivanov
fuente
entityManager.unwrap(Session.class);lo que es Sessionen Session.class? ¿es una importación?
Thang Pham
2
El Manual de Hibernación cambió. El punto 15.8 ya no proporciona ninguna información sobre cómo obtener una sesión.
Nicktar
1
A partir de enero de 2019, el manual actual de Hibernate (5.3.7), §5.1, todavía establece esto como la forma de obtener una referencia a un objeto Session.
Alain BECKER
5

Esto lo explicará mejor.

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

'entityManager.unwrap (Session.class)' se usa para obtener la sesión de EntityManager.

@Repository
@Transactional
public class EmployeeRepository {

  @PersistenceContext
  private EntityManager entityManager;

  public Session getSession() {
    Session session = entityManager.unwrap(Session.class);
    return session;
  }

  ......
  ......

}

Enlace de la aplicación de demostración .

Hari Krishna
fuente
-1

Estaba trabajando en Wildfly pero estaba usando

org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();

y lo correcto fue

org.hibernate.Session session = (Session) manager.getDelegate();
carlos veintemilla
fuente