diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryUtils.java b/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryUtils.java index c434bbd954..c2f3a5884a 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryUtils.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2015 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. @@ -221,20 +221,23 @@ public abstract class EntityManagerFactoryUtils { (EntityManagerHolder) TransactionSynchronizationManager.getResource(emf); if (emHolder != null) { if (synchronizedWithTransaction) { - if (!emHolder.isSynchronizedWithTransaction() && - TransactionSynchronizationManager.isSynchronizationActive()) { - // Try to explicitly synchronize the EntityManager itself - // with an ongoing JTA transaction, if any. - try { - emHolder.getEntityManager().joinTransaction(); + if (!emHolder.isSynchronizedWithTransaction()) { + if (TransactionSynchronizationManager.isActualTransactionActive()) { + // Try to explicitly synchronize the EntityManager itself + // with an ongoing JTA transaction, if any. + try { + emHolder.getEntityManager().joinTransaction(); + } + catch (TransactionRequiredException ex) { + logger.debug("Could not join transaction because none was actually active", ex); + } } - catch (TransactionRequiredException ex) { - logger.debug("Could not join transaction because none was actually active", ex); + if (TransactionSynchronizationManager.isSynchronizationActive()) { + Object transactionData = prepareTransaction(emHolder.getEntityManager(), emf); + TransactionSynchronizationManager.registerSynchronization( + new TransactionalEntityManagerSynchronization(emHolder, emf, transactionData, false)); + emHolder.setSynchronizedWithTransaction(true); } - Object transactionData = prepareTransaction(emHolder.getEntityManager(), emf); - TransactionSynchronizationManager.registerSynchronization( - new TransactionalEntityManagerSynchronization(emHolder, emf, transactionData, false)); - emHolder.setSynchronizedWithTransaction(true); } // Use holder's reference count to track synchronizedWithTransaction access. // isOpen() check used below to find out about it. diff --git a/spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java b/spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java index 4c6a886728..7c72cad77e 100644 --- a/spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java +++ b/spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2015 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. @@ -722,7 +722,6 @@ public class JpaTransactionManagerTests { TransactionSynchronizationManager.unbindResource(factory); } - verify(manager).joinTransaction(); verify(manager).flush(); } @@ -754,7 +753,6 @@ public class JpaTransactionManagerTests { TransactionSynchronizationManager.unbindResource(factory); } - verify(manager).joinTransaction(); verify(manager).flush(); verify(manager).clear(); }