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(); }