avoid hard JPA 2.0 dependency

This commit is contained in:
Juergen Hoeller 2011-10-11 01:31:22 +00:00
parent 6aaf7fefde
commit 3032b214c6
1 changed files with 14 additions and 4 deletions

View File

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