From 94f367af70b1b9ce6dd3b6d5474297299a083ae6 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Fri, 18 Dec 2020 09:58:16 +1300 Subject: [PATCH] #22 - Spring @Transactional with batch mode not invoking ebean batch flush --- .../spring/txn/SpringJdbcTransactionManager.java | 12 +++--------- .../java/org/example/EbeanServerFactoryBean.java | 2 ++ src/test/java/org/example/EbeanSpringModuleTest.java | 6 ++++++ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/io/ebean/spring/txn/SpringJdbcTransactionManager.java b/src/main/java/io/ebean/spring/txn/SpringJdbcTransactionManager.java index fcac89aa6..ead75c2f4 100644 --- a/src/main/java/io/ebean/spring/txn/SpringJdbcTransactionManager.java +++ b/src/main/java/io/ebean/spring/txn/SpringJdbcTransactionManager.java @@ -49,7 +49,6 @@ public class SpringJdbcTransactionManager implements ExternalTransactionManager */ @Override public void setTransactionManager(Object txnMgr) { - // RB: At this stage not exposing TransactionManager to // the public API and hence the Object type and casting here this.transactionManager = (TransactionManager) txnMgr; @@ -64,10 +63,8 @@ public class SpringJdbcTransactionManager implements ExternalTransactionManager */ @Override public Object getCurrentTransaction() { - // Get the current Spring ConnectionHolder associated to the current spring managed transaction ConnectionHolder holder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource); - if (holder == null || !holder.isSynchronizedWithTransaction()) { // no current Spring transaction SpiTransaction currentEbeanTransaction = transactionManager.getInScope(); @@ -90,7 +87,6 @@ public class SpringJdbcTransactionManager implements ExternalTransactionManager // Create and register a Spring TransactionSynchronization for this transaction springTxnLister = createSpringTxnListener(newTrans); TransactionSynchronizationManager.registerSynchronization(springTxnLister); - return transactionManager.externalBeginTransaction(newTrans, TxScope.required()); } } @@ -102,7 +98,6 @@ public class SpringJdbcTransactionManager implements ExternalTransactionManager *

*/ private SpringTxnListener getSpringTxnListener() { - if (TransactionSynchronizationManager.isSynchronizationActive()) { List synchronizations = TransactionSynchronizationManager.getSynchronizations(); if (synchronizations != null) { @@ -114,7 +109,6 @@ public class SpringJdbcTransactionManager implements ExternalTransactionManager } } } - return null; } @@ -164,13 +158,13 @@ public class SpringJdbcTransactionManager implements ExternalTransactionManager @Override public void beforeCommit(boolean readOnly) { - // Future note: for JPA2 locking we will - // have beforeCommit events to fire + if (!readOnly) { + transaction.flushBatch(); + } } @Override public void afterCompletion(int status) { - switch (status) { case STATUS_COMMITTED: log.debug("Spring Txn [{}] committed", transaction.getId()); diff --git a/src/test/java/org/example/EbeanServerFactoryBean.java b/src/test/java/org/example/EbeanServerFactoryBean.java index b5dc172ea..41a128a8f 100644 --- a/src/test/java/org/example/EbeanServerFactoryBean.java +++ b/src/test/java/org/example/EbeanServerFactoryBean.java @@ -1,5 +1,6 @@ package org.example; +import io.ebean.annotation.PersistBatch; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; @@ -31,6 +32,7 @@ public class EbeanServerFactoryBean implements InitializingBean, FactoryBean