From f3102ba02c004aa941f045f0f8e7ae342cb5e0a8 Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Thu, 22 Oct 2015 13:29:21 +1300 Subject: [PATCH] #432 - Delete using Query does not commit --- .../ebeaninternal/api/ScopedTransaction.java | 5 ----- .../ebeaninternal/api/SpiTransaction.java | 5 ----- .../server/core/DefaultServer.java | 1 + .../server/core/OrmQueryRequest.java | 9 +++++++- .../server/core/RelationalQueryRequest.java | 2 +- .../server/core/SpiOrmQueryRequest.java | 4 ++++ .../server/transaction/JdbcTransaction.java | 17 --------------- .../avaje/tests/delete/TestDeleteByQuery.java | 21 +++++++++++++++++++ 8 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/avaje/ebeaninternal/api/ScopedTransaction.java b/src/main/java/com/avaje/ebeaninternal/api/ScopedTransaction.java index 788317eeb..f2a15ebd2 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/ScopedTransaction.java +++ b/src/main/java/com/avaje/ebeaninternal/api/ScopedTransaction.java @@ -59,11 +59,6 @@ public class ScopedTransaction implements SpiTransaction { } } - @Override - public void endQueryOnly() { - transaction.endQueryOnly(); - } - @Override public String getLogPrefix() { return transaction.getLogPrefix(); diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiTransaction.java b/src/main/java/com/avaje/ebeaninternal/api/SpiTransaction.java index 1b36a0ef9..291bc6954 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/SpiTransaction.java +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiTransaction.java @@ -19,11 +19,6 @@ import com.avaje.ebeaninternal.server.persist.BatchControl; */ public interface SpiTransaction extends Transaction { - /** - * End the transaction when had query only use. - */ - void endQueryOnly(); - /** * Return the string prefix with the transactin id and label used in logging. */ diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java index c09c5a6fc..6ec3524ca 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java @@ -1301,6 +1301,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { SpiOrmQueryRequest request = createQueryRequest(Type.DELETE, query, t); try { request.initTransIfRequired(); + request.markNotQueryOnly(); return request.delete(); } finally { request.endTransIfRequired(); diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java index ea6f2c826..4735cce1a 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java @@ -72,6 +72,13 @@ public final class OrmQueryRequest extends BeanRequest implements BeanQueryRe this.readOnly = query.isReadOnly(); } + /** + * Mark the transaction as not being query only. + */ + @Override + public void markNotQueryOnly() { + transaction.markNotQueryOnly(); + } /** * Return the database platform like clause. @@ -219,7 +226,7 @@ public final class OrmQueryRequest extends BeanRequest implements BeanQueryRe */ public void endTransIfRequired() { if (createdTransaction) { - transaction.endQueryOnly(); + transaction.commit(); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/RelationalQueryRequest.java b/src/main/java/com/avaje/ebeaninternal/server/core/RelationalQueryRequest.java index 63cca02ba..0f3f3fb07 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/RelationalQueryRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/RelationalQueryRequest.java @@ -59,7 +59,7 @@ public final class RelationalQueryRequest { */ public void endTransIfRequired() { if (createdTransaction) { - trans.endQueryOnly(); + trans.commit(); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/SpiOrmQueryRequest.java b/src/main/java/com/avaje/ebeaninternal/server/core/SpiOrmQueryRequest.java index b463f2d13..b2b6d5a55 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/SpiOrmQueryRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/SpiOrmQueryRequest.java @@ -112,4 +112,8 @@ public interface SpiOrmQueryRequest { */ String getDBLikeClause(); + /** + * Mark the underlying transaction as not being query only. + */ + void markNotQueryOnly(); } \ No newline at end of file diff --git a/src/main/java/com/avaje/ebeaninternal/server/transaction/JdbcTransaction.java b/src/main/java/com/avaje/ebeaninternal/server/transaction/JdbcTransaction.java index d7efc2334..1a61d739c 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/transaction/JdbcTransaction.java +++ b/src/main/java/com/avaje/ebeaninternal/server/transaction/JdbcTransaction.java @@ -849,23 +849,6 @@ public class JdbcTransaction implements SpiTransaction { connection.commit(); } - /** - * End the transaction on a query only request. - */ - @Override - public void endQueryOnly() { - if (!isActive()) { - throw new IllegalStateException(illegalStateMessage); - } - try { - connectionEndForQueryOnly(); - } finally { - // these will not throw an exception - deactivate(); - notifyQueryOnly(); - } - } - /** * Commit the transaction. */ diff --git a/src/test/java/com/avaje/tests/delete/TestDeleteByQuery.java b/src/test/java/com/avaje/tests/delete/TestDeleteByQuery.java index 03b4553d2..59a5116a2 100644 --- a/src/test/java/com/avaje/tests/delete/TestDeleteByQuery.java +++ b/src/test/java/com/avaje/tests/delete/TestDeleteByQuery.java @@ -5,6 +5,8 @@ import com.avaje.ebean.Ebean; import com.avaje.ebean.EbeanServer; import com.avaje.ebean.Query; import com.avaje.tests.model.basic.Contact; +import com.avaje.tests.model.basic.Customer; +import com.avaje.tests.model.basic.ResetBasicData; import org.avaje.ebeantest.LoggedSqlCollector; import org.junit.Test; @@ -49,4 +51,23 @@ public class TestDeleteByQuery extends BaseTestCase { assertThat(list).isEmpty(); } + @Test + public void testCommit() { + + ResetBasicData.reset(); + + List all = Customer.find.all(); + Contact contact = new Contact(); + contact.setFirstName("DelByQueryFirstName"); + contact.setLastName("deleteMe"); + contact.setCustomer(all.get(0)); + + Ebean.save(contact); + + Ebean.find(Contact.class).select("id").where().eq("firstName", "DelByQueryFirstName").delete(); + + Contact contactFind = Ebean.find(Contact.class, contact.getId()); + assertThat(contactFind).isNull(); + + } }