|
|
|
@ -266,21 +266,28 @@ public abstract class EntityManagerFactoryUtils {
@@ -266,21 +266,28 @@ public abstract class EntityManagerFactoryUtils {
|
|
|
|
|
em = (!CollectionUtils.isEmpty(properties) ? emf.createEntityManager(properties) : emf.createEntityManager()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Use same EntityManager for further JPA operations within the transaction.
|
|
|
|
|
// Thread-bound object will get removed by synchronization at transaction completion.
|
|
|
|
|
emHolder = new EntityManagerHolder(em); |
|
|
|
|
if (synchronizedWithTransaction) { |
|
|
|
|
Object transactionData = prepareTransaction(em, emf); |
|
|
|
|
TransactionSynchronizationManager.registerSynchronization( |
|
|
|
|
new TransactionalEntityManagerSynchronization(emHolder, emf, transactionData, true)); |
|
|
|
|
emHolder.setSynchronizedWithTransaction(true); |
|
|
|
|
try { |
|
|
|
|
// Use same EntityManager for further JPA operations within the transaction.
|
|
|
|
|
// Thread-bound object will get removed by synchronization at transaction completion.
|
|
|
|
|
emHolder = new EntityManagerHolder(em); |
|
|
|
|
if (synchronizedWithTransaction) { |
|
|
|
|
Object transactionData = prepareTransaction(em, emf); |
|
|
|
|
TransactionSynchronizationManager.registerSynchronization( |
|
|
|
|
new TransactionalEntityManagerSynchronization(emHolder, emf, transactionData, true)); |
|
|
|
|
emHolder.setSynchronizedWithTransaction(true); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
// Unsynchronized - just scope it for the transaction, as demanded by the JPA 2.1 spec...
|
|
|
|
|
TransactionSynchronizationManager.registerSynchronization( |
|
|
|
|
new TransactionScopedEntityManagerSynchronization(emHolder, emf)); |
|
|
|
|
} |
|
|
|
|
TransactionSynchronizationManager.bindResource(emf, emHolder); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
// Unsynchronized - just scope it for the transaction, as demanded by the JPA 2.1 spec...
|
|
|
|
|
TransactionSynchronizationManager.registerSynchronization( |
|
|
|
|
new TransactionScopedEntityManagerSynchronization(emHolder, emf)); |
|
|
|
|
catch (RuntimeException ex) { |
|
|
|
|
// Unexpected exception from external delegation call -> close EntityManager and rethrow.
|
|
|
|
|
closeEntityManager(em); |
|
|
|
|
throw ex; |
|
|
|
|
} |
|
|
|
|
TransactionSynchronizationManager.bindResource(emf, emHolder); |
|
|
|
|
|
|
|
|
|
return em; |
|
|
|
|
} |
|
|
|
|