diff --git a/src/main/java/io/ebean/EbeanServer.java b/src/main/java/io/ebean/EbeanServer.java index 11c6ff5cd..22cb020ba 100644 --- a/src/main/java/io/ebean/EbeanServer.java +++ b/src/main/java/io/ebean/EbeanServer.java @@ -613,6 +613,19 @@ public interface EbeanServer { */ Transaction currentTransaction(); + /** + * Flush the JDBC batch on the current transaction. + *
+ * This only is useful when JDBC batch is used. Flush occurs automatically when the + * transaction commits or batch size is reached. This manually flushes the JDBC batch + * buffer. + *
+ *
+ * This is the same as currentTransaction().flush().
+ *
+ * When using JDBC batch flushing occurs automatically at commit() time or when the batch size + * is reached. This provides the ability to manually flush the batch. + *
+ */ + public void flush() { + db().flush(); + } + /** * Update this entity. * diff --git a/src/main/java/io/ebean/Transaction.java b/src/main/java/io/ebean/Transaction.java index b36e6491c..6b645f9b6 100644 --- a/src/main/java/io/ebean/Transaction.java +++ b/src/main/java/io/ebean/Transaction.java @@ -429,6 +429,14 @@ public interface Transaction extends AutoCloseable { *+ * flush() is preferred as it matches the JPA flush() method. + *
+ */ void flushBatch() throws PersistenceException; /** diff --git a/src/main/java/io/ebeaninternal/api/ScopedTransaction.java b/src/main/java/io/ebeaninternal/api/ScopedTransaction.java index 57ec62df0..145491135 100644 --- a/src/main/java/io/ebeaninternal/api/ScopedTransaction.java +++ b/src/main/java/io/ebeaninternal/api/ScopedTransaction.java @@ -295,9 +295,14 @@ public class ScopedTransaction implements SpiTransaction { return transaction.isBatchFlushOnQuery(); } + @Override + public void flush() throws PersistenceException { + transaction.flush(); + } + @Override public void flushBatch() throws PersistenceException { - transaction.flushBatch(); + flush(); } @Override diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java index a3523f691..4b9eb23bf 100644 --- a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java @@ -840,6 +840,11 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { return transactionScopeManager.get(); } + @Override + public void flush() { + currentTransaction().flush(); + } + /** * Commit the current transaction. */ diff --git a/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java b/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java index a890a3104..9b9d31ce7 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java +++ b/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java @@ -731,13 +731,18 @@ public class JdbcTransaction implements SpiTransaction { * */ @Override - public void flushBatch() { + public void flush() { if (!isActive()) { throw new IllegalStateException(illegalStateMessage); } internalBatchFlush(); } + @Override + public void flushBatch() { + flush(); + } + /** * Flush the JDBC batch and execute derived relationship statements if necessary. */ diff --git a/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java b/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java index 8f0f0fc6f..6df8b1b6b 100644 --- a/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java +++ b/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java @@ -460,6 +460,11 @@ public class TDSpiEbeanServer implements SpiEbeanServer { return null; } + @Override + public void flush() { + + } + @Override public void commitTransaction() { diff --git a/src/test/java/org/tests/transaction/TestBatchModelFlush.java b/src/test/java/org/tests/transaction/TestBatchModelFlush.java new file mode 100644 index 000000000..752ad8096 --- /dev/null +++ b/src/test/java/org/tests/transaction/TestBatchModelFlush.java @@ -0,0 +1,27 @@ +package org.tests.transaction; + +import io.ebean.BaseTestCase; +import io.ebean.annotation.Transactional; +import org.junit.Test; +import org.tests.model.m2m.MnyB; + +public class TestBatchModelFlush extends BaseTestCase { + + @Transactional(batchSize = 50) + @Test + public void insert() { + + new MnyB("TestBatchModelFlush_0").save(); + new MnyB("TestBatchModelFlush_1").save(); + + MnyB bean = new MnyB("TestBatchModelFlush_2"); + bean.save(); + bean.db().currentTransaction().flush(); + + MnyB bean2 = new MnyB("TestBatchModelFlush_3"); + bean2.save(); + bean2.db().flush(); + + new MnyB("TestBatchModelFlush_4").save(); + } +}