web-dev-qa-db-de.com

Wie kann ich das Sitzungsobjekt erhalten, wenn ich den Entitymanager habe?

Ich habe

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

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

99
storm_buster

Um vollständig zu sein, ist es anders, wenn Sie eine JPA 1.0- oder JPA 2.0-Implementierung verwenden.

JPA 1.0

In JPA 1.0 müssten Sie EntityManager#getDelegate() verwenden. Beachten Sie jedoch, dass das Ergebnis dieser Methode implementierungsspezifisch ist dh nicht portierbar vom Anwendungsserver mit Hibernate zum andere. Zum Beispiel mit JBoss würden Sie tun:

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

Aber mit GlassFish , müssten Sie 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 new vorzuziehen ist anwendungen.

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

Session session = entityManager.unwrap(Session.class);
169
Pascal Thivent

Siehe den Abschnitt " 5.1. Zugriff auf Hibernate-APIs über JPA" im Hibernate ORM User Guide :

Session session = entityManager.unwrap(Session.class);
37
Vladimir Ivanov

Dies wird besser erklären.

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