HibernateJpaDialect does NOT expose underlying Session for underlying SessionFactory anymore (SPR-8771)

This commit is contained in:
Juergen Hoeller 2011-11-27 23:50:37 +00:00
parent 16933a511d
commit f50f3d2405
1 changed files with 2 additions and 25 deletions

View File

@ -20,15 +20,12 @@ import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.SQLException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceException;
import org.hibernate.FlushMode;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.ejb.HibernateEntityManager;
import org.hibernate.ejb.HibernateEntityManagerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.datasource.ConnectionHandle;
@ -38,8 +35,6 @@ import org.springframework.orm.jpa.DefaultJpaDialect;
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;
/**
@ -54,10 +49,6 @@ 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 {
@ -88,22 +79,12 @@ public class HibernateJpaDialect extends DefaultJpaDialect {
previousFlushMode = flushMode;
}
}
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);
}
@Override
public void cleanupTransaction(Object transactionData) {
((SessionTransactionData) transactionData).cleanup();
((SessionTransactionData) transactionData).resetFlushMode();
}
@Override
@ -153,11 +134,7 @@ public class HibernateJpaDialect extends DefaultJpaDialect {
this.previousFlushMode = previousFlushMode;
}
public void cleanup() {
SessionFactory sessionFactory = this.session.getSessionFactory();
if (TransactionSynchronizationManager.hasResource(sessionFactory)) {
TransactionSynchronizationManager.unbindResource(sessionFactory);
}
public void resetFlushMode() {
if (this.previousFlushMode != null) {
this.session.setFlushMode(this.previousFlushMode);
}