Skip to content

Commit 37c601c

Browse files
committed
HibernateJpaDialect exposes underlying Session for underlying SessionFactory
1 parent 0ff8360 commit 37c601c

File tree

3 files changed

+74
-4
lines changed

3 files changed

+74
-4
lines changed

org.springframework.orm/src/main/java/org/springframework/orm/hibernate3/SessionFactoryUtils.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2009 the original author or authors.
2+
* Copyright 2002-2011 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -280,7 +280,11 @@ private static Session doGetSession(
280280

281281
Assert.notNull(sessionFactory, "No SessionFactory specified");
282282

283-
SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);
283+
Object resource = TransactionSynchronizationManager.getResource(sessionFactory);
284+
if (resource instanceof Session) {
285+
return (Session) resource;
286+
}
287+
SessionHolder sessionHolder = (SessionHolder) resource;
284288
if (sessionHolder != null && !sessionHolder.isEmpty()) {
285289
// pre-bound Hibernate Session
286290
Session session = null;

org.springframework.orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaDialect.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,15 @@
2020
import java.sql.Connection;
2121
import java.sql.SQLException;
2222
import javax.persistence.EntityManager;
23+
import javax.persistence.EntityManagerFactory;
2324
import javax.persistence.PersistenceException;
2425

2526
import org.hibernate.FlushMode;
2627
import org.hibernate.HibernateException;
2728
import org.hibernate.Session;
29+
import org.hibernate.SessionFactory;
2830
import org.hibernate.ejb.HibernateEntityManager;
31+
import org.hibernate.ejb.HibernateEntityManagerFactory;
2932

3033
import org.springframework.dao.DataAccessException;
3134
import org.springframework.jdbc.datasource.ConnectionHandle;
@@ -35,6 +38,7 @@
3538
import org.springframework.orm.jpa.EntityManagerFactoryUtils;
3639
import org.springframework.transaction.TransactionDefinition;
3740
import org.springframework.transaction.TransactionException;
41+
import org.springframework.transaction.support.TransactionSynchronizationManager;
3842
import org.springframework.util.ReflectionUtils;
3943

4044
/**
@@ -79,12 +83,17 @@ public Object prepareTransaction(EntityManager entityManager, boolean readOnly,
7983
previousFlushMode = flushMode;
8084
}
8185
}
86+
EntityManagerFactory emf = entityManager.getEntityManagerFactory();
87+
if (emf instanceof HibernateEntityManagerFactory) {
88+
SessionFactory sf = ((HibernateEntityManagerFactory) emf).getSessionFactory();
89+
TransactionSynchronizationManager.bindResource(sf, session);
90+
}
8291
return new SessionTransactionData(session, previousFlushMode);
8392
}
8493

8594
@Override
8695
public void cleanupTransaction(Object transactionData) {
87-
((SessionTransactionData) transactionData).resetFlushMode();
96+
((SessionTransactionData) transactionData).cleanup();
8897
}
8998

9099
@Override
@@ -134,7 +143,8 @@ public SessionTransactionData(Session session, FlushMode previousFlushMode) {
134143
this.previousFlushMode = previousFlushMode;
135144
}
136145

137-
public void resetFlushMode() {
146+
public void cleanup() {
147+
TransactionSynchronizationManager.unbindResource(this.session.getSessionFactory());
138148
if (this.previousFlushMode != null) {
139149
this.session.setFlushMode(this.previousFlushMode);
140150
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright 2002-2011 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.orm.jpa.vendor;
18+
19+
import javax.persistence.EntityManagerFactory;
20+
21+
import org.hibernate.SessionFactory;
22+
import org.hibernate.ejb.HibernateEntityManagerFactory;
23+
24+
import org.springframework.beans.factory.FactoryBean;
25+
import org.springframework.orm.jpa.EntityManagerFactoryAccessor;
26+
import org.springframework.util.Assert;
27+
28+
/**
29+
* Simple <code>FactoryBean</code> that exposes the underlying {@link SessionFactory}
30+
* behind a Hibernate-backed JPA {@link EntityManagerFactory}.
31+
*
32+
* <p>Primarily available for resolving a SessionFactory by JPA persistence unit name
33+
* via the {@link #setPersistenceUnitName "persistenceUnitName"} bean property.
34+
*
35+
* @author Juergen Hoeller
36+
* @since 3.1
37+
* @see #setPersistenceUnitName
38+
* @see #setEntityManagerFactory
39+
*/
40+
public class HibernateJpaSessionFactoryBean extends EntityManagerFactoryAccessor implements FactoryBean<SessionFactory> {
41+
42+
public SessionFactory getObject() {
43+
EntityManagerFactory emf = getEntityManagerFactory();
44+
Assert.isInstanceOf(HibernateEntityManagerFactory.class, emf);
45+
return ((HibernateEntityManagerFactory) emf).getSessionFactory();
46+
}
47+
48+
public Class<?> getObjectType() {
49+
return SessionFactory.class;
50+
}
51+
52+
public boolean isSingleton() {
53+
return true;
54+
}
55+
56+
}

0 commit comments

Comments
 (0)