HibernateJpaDialect exposes underlying Session for underlying SessionFactory

This commit is contained in:
Juergen Hoeller 2011-10-11 00:58:47 +00:00
parent 0ff83606df
commit 37c601c8dd
3 changed files with 74 additions and 4 deletions

View File

@ -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;

View File

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

View File

@ -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 <code>FactoryBean</code> that exposes the underlying {@link SessionFactory}
* behind a Hibernate-backed JPA {@link EntityManagerFactory}.
*
* <p>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<SessionFactory> {
public SessionFactory getObject() {
EntityManagerFactory emf = getEntityManagerFactory();
Assert.isInstanceOf(HibernateEntityManagerFactory.class, emf);
return ((HibernateEntityManagerFactory) emf).getSessionFactory();
}
public Class<?> getObjectType() {
return SessionFactory.class;
}
public boolean isSingleton() {
return true;
}
}