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