From 19491d5ae6c5ba0cc15119421c3acdd66ea4db5e Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Mon, 12 Mar 2018 21:45:14 +1300 Subject: [PATCH] #19 - java.lang.IllegalStateException: Transaction is Inactive ... when using Ebean transactions with Ebean's Spring transaction manager --- .../txn/SpringJdbcTransactionManager.java | 7 +++--- .../org/example/EbeanSpringModuleTest.java | 23 +++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/ebean/spring/txn/SpringJdbcTransactionManager.java b/src/main/java/io/ebean/spring/txn/SpringJdbcTransactionManager.java index 30dd6ae88..fcac89aa6 100644 --- a/src/main/java/io/ebean/spring/txn/SpringJdbcTransactionManager.java +++ b/src/main/java/io/ebean/spring/txn/SpringJdbcTransactionManager.java @@ -71,12 +71,11 @@ public class SpringJdbcTransactionManager implements ExternalTransactionManager if (holder == null || !holder.isSynchronizedWithTransaction()) { // no current Spring transaction SpiTransaction currentEbeanTransaction = transactionManager.getInScope(); - if (currentEbeanTransaction != null && currentEbeanTransaction.isActive()) { // this is unexpected - log.warn("No current Spring transaction BUT using current Ebean one {}", currentEbeanTransaction.getId()); + if (currentEbeanTransaction == null || !currentEbeanTransaction.isActive()) { + return null; } else { - log.trace("No current Spring transaction"); + return currentEbeanTransaction; } - return currentEbeanTransaction; } SpringTxnListener springTxnLister = getSpringTxnListener(); diff --git a/src/test/java/org/example/EbeanSpringModuleTest.java b/src/test/java/org/example/EbeanSpringModuleTest.java index 58dcfd96d..7d5c05592 100644 --- a/src/test/java/org/example/EbeanSpringModuleTest.java +++ b/src/test/java/org/example/EbeanSpringModuleTest.java @@ -1,5 +1,7 @@ package org.example; +import io.ebean.Ebean; +import io.ebean.Transaction; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; @@ -34,6 +36,27 @@ public class EbeanSpringModuleTest { super(); } + /** + * Test app. + */ + @Test + public void testInactiveTransaction() { + + Transaction transaction = Ebean.beginTransaction(); + long id; + try { + User user = new User(); + user.setName("save with txn 1"); + Ebean.save(user); + transaction.commit(); + id = user.getOid(); + } finally { + // don't end the transaction ... + //transaction.end(); + } + + Ebean.delete(User.class, id); + } @Test public void testBatchInsert() {