Wie kann ich das Sitzungsobjekt erhalten, wenn ich die EntityManager haben
-
30-09-2019 - |
Frage
Ich habe
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria( ??? ).list();
}
Wie kann ich rufe Sie die Sitzung, wenn am EntityManager verwenden oder wie kann ich das Ergebnis von meinem DetachedCriteria bekommen?
Lösung
Um völlig erschöpfend sein, die Dinge anders, wenn Sie eine JPA 1.0 oder eine JPA 2.0-Implementierung verwenden.
JPA 1.0
Mit JPA 1.0, dann würden Sie verwenden müssen EntityManager#getDelegate()
. Aber bedenken Sie, dass das Ergebnis dieser Methode ist die Umsetzung spezifischer das heißt nicht tragbar vom Anwendungsserver mit Hibernate auf der anderen Seite. Zum Beispiel mit JBoss Sie tun würden:
org.hibernate.Session session = (Session) manager.getDelegate();
Aber mit Glassfish , Sie würden zu tun haben:
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
Ich bin damit einverstanden, das ist schrecklich, und die Spezifikation ist hier verantwortlich zu machen (nicht klar genug).
JPA 2.0
Mit JPA 2.0 gibt es eine neue (und viel besser) EntityManager#unwrap(Class<T>)
Methode, die EntityManager#getDelegate()
für neue Anwendungen.
So mit Hibernate als JPA 2.0-Implementierung (siehe 3.15 india Hibernate API ), würden Sie tun.
Session session = entityManager.unwrap(Session.class);
Andere Tipps
Siehe Abschnitt " 5.1. Zugriff auf Hibernate APIs von JPA " in der Hibernate ORM Benutzerhandbuch :
Session session = entityManager.unwrap(Session.class);
Dies wird besser erklären.
EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
Ich war in Wildfly arbeiten, aber ich wurde mit
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
und die richtige war
org.hibernate.Session session = (Session) manager.getDelegate();