diff --git a/hibernate-core/src/main/java/org/hibernate/engine/transaction/internal/TransactionImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/transaction/internal/TransactionImpl.java index c8bdeeb70f0f..a4854b637968 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/transaction/internal/TransactionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/transaction/internal/TransactionImpl.java @@ -34,6 +34,7 @@ public class TransactionImpl implements TransactionImplementor { public TransactionImpl(TransactionCoordinator transactionCoordinator, ExceptionConverter exceptionConverter) { this.transactionCoordinator = transactionCoordinator; this.exceptionConverter = exceptionConverter; + transactionDriverControl = transactionCoordinator.getTransactionDriverControl(); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java b/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java index 7a387459691c..0f9003ceb659 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java @@ -335,9 +335,7 @@ protected void errorIfClosed() { @Override public void markForRollbackOnly() { - if ( currentHibernateTransaction != null ) { - currentHibernateTransaction.markRollbackOnly(); - } + accessTransaction().markRollbackOnly(); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java index 5dd09739eb39..4994383a1a80 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java @@ -847,10 +847,9 @@ public void merge(String entityName, Object object, Map copiedAlready) throws Hi private Object fireMerge(MergeEvent event) { checkOpen(); - checkTransactionSynchStatus(); - checkNoUnresolvedActionsBeforeOperation(); - try { + checkTransactionSynchStatus(); + checkNoUnresolvedActionsBeforeOperation(); for ( MergeEventListener listener : listeners( EventType.MERGE ) ) { listener.onMerge( event ); } @@ -872,9 +871,9 @@ private Object fireMerge(MergeEvent event) { private void fireMerge(Map copiedAlready, MergeEvent event) { checkOpen(); - checkTransactionSynchStatus(); try { + checkTransactionSynchStatus(); for ( MergeEventListener listener : listeners( EventType.MERGE ) ) { listener.onMerge( event, copiedAlready ); } @@ -958,20 +957,48 @@ private void logRemoveOrphanBeforeUpdates(String timing, String entityName, Obje private void fireDelete(DeleteEvent event) { checkOpen(); + try{ checkTransactionSynchStatus(); for ( DeleteEventListener listener : listeners( EventType.DELETE ) ) { listener.onDelete( event ); } - delayedAfterCompletion(); + } + catch ( ObjectDeletedException sse ) { + throw exceptionConverter.convert( new IllegalArgumentException( sse ) ); + } + catch ( MappingException e ) { + throw exceptionConverter.convert( new IllegalArgumentException( e.getMessage(), e ) ); + } + catch ( RuntimeException e ) { + //including HibernateException + throw exceptionConverter.convert( e ); + } + finally { + delayedAfterCompletion(); + } } private void fireDelete(DeleteEvent event, Set transientEntities) { checkOpen(); + try{ checkTransactionSynchStatus(); for ( DeleteEventListener listener : listeners( EventType.DELETE ) ) { listener.onDelete( event, transientEntities ); } - delayedAfterCompletion(); + } + catch ( ObjectDeletedException sse ) { + throw exceptionConverter.convert( new IllegalArgumentException( sse ) ); + } + catch ( MappingException e ) { + throw exceptionConverter.convert( new IllegalArgumentException( e.getMessage(), e ) ); + } + catch ( RuntimeException e ) { + //including HibernateException + throw exceptionConverter.convert( e ); + } + finally { + delayedAfterCompletion(); + } }