#2137 - Expected Transaction flush on SqlQuery and DtoQuery not occurring

This commit is contained in:
rob bygrave
2020-12-21 14:11:28 +13:00
parent 573e1b553c
commit e98ff952bf
4 changed files with 54 additions and 0 deletions
@@ -73,6 +73,12 @@ public abstract class AbstractSqlQueryRequest {
}
}
protected void flushJdbcBatchOnQuery() {
if (trans.isFlushOnQuery()) {
trans.flush();
}
}
public EbeanServer getServer() {
return server;
}
@@ -88,14 +88,17 @@ public final class DtoQueryRequest<T> extends AbstractSqlQueryRequest {
}
public void findEach(Consumer<T> consumer) {
flushJdbcBatchOnQuery();
queryEngine.findEach(this, consumer);
}
public void findEachWhile(Predicate<T> consumer) {
flushJdbcBatchOnQuery();
queryEngine.findEachWhile(this, consumer);
}
public List<T> findList() {
flushJdbcBatchOnQuery();
return queryEngine.findList(this);
}
@@ -56,35 +56,43 @@ public final class RelationalQueryRequest extends AbstractSqlQueryRequest {
}
boolean findEachRow(RowConsumer mapper) {
flushJdbcBatchOnQuery();
queryEngine.findEachRow(this, mapper);
return true;
}
<T> List<T> findListMapper(RowMapper<T> mapper) {
flushJdbcBatchOnQuery();
return queryEngine.findListMapper(this, mapper);
}
<T> T findOneMapper(RowMapper<T> mapper) {
flushJdbcBatchOnQuery();
return queryEngine.findOneMapper(this, mapper);
}
public <T> List<T> findSingleAttributeList(Class<T> cls) {
flushJdbcBatchOnQuery();
return queryEngine.findSingleAttributeList(this, cls);
}
public <T> T findSingleAttribute(Class<T> cls) {
flushJdbcBatchOnQuery();
return queryEngine.findSingleAttribute(this, cls);
}
public void findEach(Consumer<SqlRow> consumer) {
flushJdbcBatchOnQuery();
queryEngine.findEach(this, consumer);
}
public void findEachWhile(Predicate<SqlRow> consumer) {
flushJdbcBatchOnQuery();
queryEngine.findEach(this, consumer);
}
public List<SqlRow> findList() {
flushJdbcBatchOnQuery();
return queryEngine.findList(this);
}
@@ -1,6 +1,8 @@
package org.tests.batchinsert;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.DtoQuery2Test;
import io.ebean.Ebean;
import io.ebean.EbeanServer;
import io.ebean.Transaction;
@@ -105,6 +107,41 @@ public class TestBatchInsertFlush extends BaseTestCase {
assertSql(sql.get(0)).contains("select count(*)");
}
@Test
@Transactional(batchSize = 20)
public void transactional_flushOnSqlQuery() {
LoggedSqlCollector.start();
DB.save(new EBasicVer("b1"));
DB.save(new EBasicVer("b2"));
// trigger JDBC batch by default
DB.sqlQuery("select count(*) from e_basicver")
.mapToScalar(Integer.class)
.findOne();
List<String> sql = LoggedSqlCollector.stop();
assertSql(sql.get(0)).contains("insert into e_basicver");
}
@Test
@Transactional(batchSize = 20)
public void transactional_flushOnDtoQuery() {
LoggedSqlCollector.start();
DB.save(new EBasicVer("b1"));
DB.save(new EBasicVer("b2"));
// trigger JDBC batch by default
DB.findDto(DtoQuery2Test.DCust.class, "select id, name from o_customer")
.findList();
List<String> sql = LoggedSqlCollector.stop();
assertSql(sql.get(0)).contains("insert into e_basicver");
}
@Test
@Transactional(batch = PersistBatch.ALL)
public void transactional_flushOnQuery() {