Cleanup after unexpected exception from external delegation call
Issue: SPR-17559
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user