diff --git a/org.springframework.orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaDialect.java b/org.springframework.orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaDialect.java index 21bf931d634..784f7f41b34 100644 --- a/org.springframework.orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaDialect.java +++ b/org.springframework.orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaDialect.java @@ -39,6 +39,7 @@ import org.springframework.orm.jpa.EntityManagerFactoryUtils; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionException; import org.springframework.transaction.support.TransactionSynchronizationManager; +import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; /** @@ -53,6 +54,10 @@ import org.springframework.util.ReflectionUtils; */ public class HibernateJpaDialect extends DefaultJpaDialect { + private static final Method getEntityManagerFactoryMethod = + ClassUtils.getMethodIfAvailable(EntityManager.class, "getEntityManagerFactory"); + + @Override public Object beginTransaction(EntityManager entityManager, TransactionDefinition definition) throws PersistenceException, SQLException, TransactionException { @@ -83,10 +88,15 @@ public class HibernateJpaDialect extends DefaultJpaDialect { previousFlushMode = flushMode; } } - EntityManagerFactory emf = entityManager.getEntityManagerFactory(); - if (emf instanceof HibernateEntityManagerFactory) { - SessionFactory sf = ((HibernateEntityManagerFactory) emf).getSessionFactory(); - TransactionSynchronizationManager.bindResource(sf, session); + if (getEntityManagerFactoryMethod != null) { + // We're on JPA 2.0, enabling our exposure of the underlying Session + // to the underlying SessionFactory as transaction resource reference. + EntityManagerFactory emf = + (EntityManagerFactory) ReflectionUtils.invokeMethod(getEntityManagerFactoryMethod, entityManager); + if (emf instanceof HibernateEntityManagerFactory) { + SessionFactory sf = ((HibernateEntityManagerFactory) emf).getSessionFactory(); + TransactionSynchronizationManager.bindResource(sf, session); + } } return new SessionTransactionData(session, previousFlushMode); }