Skip to content

Commit 3032b21

Browse files
committed
avoid hard JPA 2.0 dependency
1 parent 6aaf7fe commit 3032b21

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.springframework.transaction.TransactionDefinition;
4040
import org.springframework.transaction.TransactionException;
4141
import org.springframework.transaction.support.TransactionSynchronizationManager;
42+
import org.springframework.util.ClassUtils;
4243
import org.springframework.util.ReflectionUtils;
4344

4445
/**
@@ -53,6 +54,10 @@
5354
*/
5455
public class HibernateJpaDialect extends DefaultJpaDialect {
5556

57+
private static final Method getEntityManagerFactoryMethod =
58+
ClassUtils.getMethodIfAvailable(EntityManager.class, "getEntityManagerFactory");
59+
60+
5661
@Override
5762
public Object beginTransaction(EntityManager entityManager, TransactionDefinition definition)
5863
throws PersistenceException, SQLException, TransactionException {
@@ -83,10 +88,15 @@ public Object prepareTransaction(EntityManager entityManager, boolean readOnly,
8388
previousFlushMode = flushMode;
8489
}
8590
}
86-
EntityManagerFactory emf = entityManager.getEntityManagerFactory();
87-
if (emf instanceof HibernateEntityManagerFactory) {
88-
SessionFactory sf = ((HibernateEntityManagerFactory) emf).getSessionFactory();
89-
TransactionSynchronizationManager.bindResource(sf, session);
91+
if (getEntityManagerFactoryMethod != null) {
92+
// We're on JPA 2.0, enabling our exposure of the underlying Session
93+
// to the underlying SessionFactory as transaction resource reference.
94+
EntityManagerFactory emf =
95+
(EntityManagerFactory) ReflectionUtils.invokeMethod(getEntityManagerFactoryMethod, entityManager);
96+
if (emf instanceof HibernateEntityManagerFactory) {
97+
SessionFactory sf = ((HibernateEntityManagerFactory) emf).getSessionFactory();
98+
TransactionSynchronizationManager.bindResource(sf, session);
99+
}
90100
}
91101
return new SessionTransactionData(session, previousFlushMode);
92102
}

0 commit comments

Comments
 (0)