Wie kann ich das Sitzungsobjekt erhalten, wenn ich den Entity-Manager habe?

107

ich habe

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

    return detachedCriteria.getExecutableCriteria("....").list();
}

Wie kann ich die Sitzung abrufen, wenn ich Entity Manager verwende, oder wie kann ich das Ergebnis aus meinen getrennten Kriterien abrufen?

Storm_Buster
quelle
Siehe auch((EntityManagerImpl)em).getSession();
Ashley

Antworten:

181

Um vollständig zu sein, sind die Dinge anders, wenn Sie eine JPA 1.0- oder eine JPA 2.0-Implementierung verwenden.

JPA 1.0

Mit JPA 1.0 müssten Sie verwenden EntityManager#getDelegate(). Beachten Sie jedoch, dass das Ergebnis dieser Methode implementierungsspezifisch ist, dh nicht vom Anwendungsserver mithilfe des Ruhezustands auf den anderen portierbar ist. Zum Beispiel würden Sie mit JBoss Folgendes tun:

org.hibernate.Session session = (Session) manager.getDelegate();

Aber mit GlassFish müssten Sie Folgendes tun:

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

Ich stimme zu, das ist schrecklich, und die Spezifikation ist hier schuld (nicht klar genug).

JPA 2.0

Mit JPA 2.0 gibt es eine neue (und viel bessere) EntityManager#unwrap(Class<T>)Methode, die EntityManager#getDelegate()für neue Anwendungen vorzuziehen ist .

Mit Hibernate als JPA 2.0-Implementierung (siehe 3.15. Native Hibernate API ) würden Sie also Folgendes tun:

Session session = entityManager.unwrap(Session.class);
Pascal Thivent
quelle
1
entityManager.unwrap(Session.class);Was ist Sessionin Session.class? ist es ein Import?
Thang Pham
Hängt von der JPA-Implementierung ab, wenn Sie Eclipselink verwenden, ist esorg.eclipse.persistence.sessions.Session
Albciff
41

Weitere Informationen finden Sie im Abschnitt " 5.1. Zugriff auf Hibernate-APIs über JPA " im Hibernate ORM-Benutzerhandbuch :

Session session = entityManager.unwrap(Session.class);
Vladimir Ivanov
quelle
entityManager.unwrap(Session.class);Was ist Sessionin Session.class? ist es ein Import?
Thang Pham
2
Das Handbuch für den Ruhezustand wurde geändert. Punkt 15.8 enthält keine Informationen mehr zum Abrufen einer Sitzung.
Nicktar
1
Ab Januar 2019 wird im aktuellen Handbuch für den Ruhezustand (5.3.7), §5.1, immer noch angegeben, wie ein Verweis auf ein Sitzungsobjekt abgerufen werden kann.
Alain BECKER
5

Dies wird besser erklären.

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

'entityManager.unwrap (Session.class)' wird verwendet, um eine Sitzung von EntityManager abzurufen.

@Repository
@Transactional
public class EmployeeRepository {

  @PersistenceContext
  private EntityManager entityManager;

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

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

}

Link zur Demo-Anwendung .

Hari Krishna
quelle
-1

Ich habe in Wildfly gearbeitet, aber ich habe verwendet

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

und das richtige war

org.hibernate.Session session = (Session) manager.getDelegate();
Carlos Veintemilla
quelle