2010-12-02 9 views
18

Kann das Hibernate-Sitzungsobjekt vom EntityManager abgerufen werden? Ich möchte einige spezifische API Hibernate zugreifen ...Zugriff auf Hibernate-Sitzung von EJB aus mit EntityManager

Ich habe bereits versucht, so etwas wie:

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

aber sobald ich eine Methode in der EJB aufrufen I „Ein System Ausnahme während eines Aufrufs aufgetreten erhalten auf EJB“mit einem Nullpointer

ich Glassfish 3.0.1

Antwort

26

Bozho und partenon korrekt sind, aber:

In JPA 2 ist der bevorzugte Mechanismus ist entityManager.unwrap(class)

HibernateEntityManager hem = em.unwrap(HibernateEntityManager.class); 
Session session = hem.getSession(); 

ich denke, Ihre Ausnahme verursacht, weil Sie auf ein Implementierungsklasse zu werfen versuchen (vielleicht Sie hatten mit einem JDK-Proxy zu tun. In ein Interface umwandeln, und alles sollte in Ordnung sein (in der JPA 2-Version ist kein Casting erforderlich).

+0

+1 für den neuen Mechanismus – Bozho

+4

noch besser als in hier von @Pascal Thivent erklärt http://stackoverflow.com/questions/ 3493495/getting-database-connection-in-pure-jpa-setup können Sie 'em.unwrap (Session.class)' direkt verwenden. –

6

so einfach wie:

Session session = (Session) em.getDelegate(); 
6

Wenn Ihr EntityManager richtig injiziert wird (unter Verwendung von @PersistenceContext) und nicht leer ist, dann sollte die folgende Arbeit:

org.hibernate.Session hSession = (Session) em.getDelegate(); 
11

Von Hibernate EntityManager docs, die bevorzugte Art und Weise, es zu tun ist:

Session session = entityManager.unwrap(Session.class); 
Verwandte Themen