diff --git a/org.springframework.orm/src/main/java/org/springframework/orm/hibernate3/SessionFactoryUtils.java b/org.springframework.orm/src/main/java/org/springframework/orm/hibernate3/SessionFactoryUtils.java
index ab6042cc206..44c528df6c2 100644
--- a/org.springframework.orm/src/main/java/org/springframework/orm/hibernate3/SessionFactoryUtils.java
+++ b/org.springframework.orm/src/main/java/org/springframework/orm/hibernate3/SessionFactoryUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2009 the original author or authors.
+ * Copyright 2002-2011 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -280,7 +280,11 @@ public abstract class SessionFactoryUtils {
Assert.notNull(sessionFactory, "No SessionFactory specified");
- SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);
+ Object resource = TransactionSynchronizationManager.getResource(sessionFactory);
+ if (resource instanceof Session) {
+ return (Session) resource;
+ }
+ SessionHolder sessionHolder = (SessionHolder) resource;
if (sessionHolder != null && !sessionHolder.isEmpty()) {
// pre-bound Hibernate Session
Session session = null;
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 c3cda31f446..21bf931d634 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
@@ -20,12 +20,15 @@ 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;
@@ -35,6 +38,7 @@ 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.ReflectionUtils;
/**
@@ -79,12 +83,17 @@ public class HibernateJpaDialect extends DefaultJpaDialect {
previousFlushMode = flushMode;
}
}
+ EntityManagerFactory emf = entityManager.getEntityManagerFactory();
+ 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).resetFlushMode();
+ ((SessionTransactionData) transactionData).cleanup();
}
@Override
@@ -134,7 +143,8 @@ public class HibernateJpaDialect extends DefaultJpaDialect {
this.previousFlushMode = previousFlushMode;
}
- public void resetFlushMode() {
+ public void cleanup() {
+ TransactionSynchronizationManager.unbindResource(this.session.getSessionFactory());
if (this.previousFlushMode != null) {
this.session.setFlushMode(this.previousFlushMode);
}
diff --git a/org.springframework.orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaSessionFactoryBean.java b/org.springframework.orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaSessionFactoryBean.java
new file mode 100644
index 00000000000..ba3c5c4b288
--- /dev/null
+++ b/org.springframework.orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaSessionFactoryBean.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2002-2011 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.orm.jpa.vendor;
+
+import javax.persistence.EntityManagerFactory;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.ejb.HibernateEntityManagerFactory;
+
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.orm.jpa.EntityManagerFactoryAccessor;
+import org.springframework.util.Assert;
+
+/**
+ * Simple FactoryBean that exposes the underlying {@link SessionFactory}
+ * behind a Hibernate-backed JPA {@link EntityManagerFactory}.
+ *
+ *
Primarily available for resolving a SessionFactory by JPA persistence unit name
+ * via the {@link #setPersistenceUnitName "persistenceUnitName"} bean property.
+ *
+ * @author Juergen Hoeller
+ * @since 3.1
+ * @see #setPersistenceUnitName
+ * @see #setEntityManagerFactory
+ */
+public class HibernateJpaSessionFactoryBean extends EntityManagerFactoryAccessor implements FactoryBean