2010-12-02 50 views
18

Est-il possible d'obtenir l'objet Session Hibernate à partir de EntityManager? Je veux accéder à une veille prolongée API spécifique ...Accès à la session Hibernate à partir d'EJB en utilisant EntityManager

Je l'ai déjà essayé quelque chose comme:

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

mais dès que j'invoque une méthode dans l'EJB je reçois « Une exception du système a eu lieu lors d'un appel sur EJB » avec un NullPointerException

J'utilise GlassFish 3.0.1

Répondre

26

Bozho et partenon sont corrects, mais:

En JPA 2, le mécanisme préféré est entityManager.unwrap(class)

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

Je pense que votre exception est dû au fait que vous essayez de jeter à une classe de mise en œuvre (peut-être vous aviez affaire à un proxy JDK). Cast à une interface, et tout devrait bien se passer (dans la version JPA 2, aucun casting n'est nécessaire).

+0

+1 pour le nouveau mécanisme – Bozho

+4

encore mieux comme expliqué par @Pascal Thivent ici http://stackoverflow.com/questions/ 3493495/get-database-connection-in-pure-jpa-setup vous pouvez utiliser 'em.unwrap (Session.class)' directement. –

6

aussi simple que:

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

Si votre EntityManager est correctement injecté (à l'aide @PersistenceContext) et non nul, alors ce qui suit devrait fonctionner:

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

De Hibernate EntityManager docs, la façon préférée de le faire est:

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