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?

¿Fue útil?

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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top