How to access Hibernate Session in JPA applications?

In order to access Hibernate objects from a JPA application you can use the unwrap method available in the EntityManager and EntityManager Factory class:

EntityManager.<T>unwrap(Class<T>)
EntityManagerFactory.<T>unwrap(Class<T>)

This method can be used to gain access of JPA-vendor-specific classes. For example, here is how you can retrieve Hibernate’s Session and SessionFactory:

Session session = em.unwrap(Session.class);
SessionFactory sessionFactory = em.getEntityManagerFactory().unwrap(SessionFactory.class);

Please note: this method is available since JPA 2.0

JBoss AS 5

If you are running an older application server version (JBoss AS 5), you can get access to the current underlying Hibernate Session by typecasting your reference to EntityManager.:

       @PersistenceContext EntityManager entityManager;
       public void someMethod();
       {
         org.jboss.ejb3.entity.HibernateSession hs = (HibernateSession)entityManager;
         org.hibernate.Session session = hs.getHibernateSession();
       }

You can also get access to the current underlying Hibernate Query by typecasting your reference to a org.hibernate.ejb.QueryImpl.

       @PersistenceContext EntityManager entityManager;
       public void someMethod();
       {
         javax.persistence.Query query = entityManager.createQuery(...);
         org.hiberante.ejb.QueryImpl hs = (QueryImpl)query;
         org.hibernate.Query hbQuery = hs.getHibernateQuery();
       }