diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiTransaction.java b/src/main/java/com/avaje/ebeaninternal/api/SpiTransaction.java index 9cc52563c..b53accde0 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/SpiTransaction.java +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiTransaction.java @@ -212,6 +212,11 @@ public interface SpiTransaction extends Transaction { */ public void flushBatchOnCascade(); + /** + * Mark the transaction explicitly as not being query only. + */ + public void markNotQueryOnly(); + /** * Potentially escalate batch mode on saving or deleting a collection. */ @@ -222,4 +227,5 @@ public interface SpiTransaction extends Transaction { */ public void flushBatchOnCollection(); + } diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/PersistRequestCallableSql.java b/src/main/java/com/avaje/ebeaninternal/server/core/PersistRequestCallableSql.java index 7c0c200b5..4f8b0b619 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/PersistRequestCallableSql.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/PersistRequestCallableSql.java @@ -76,13 +76,6 @@ public final class PersistRequestCallableSql extends PersistRequest { public void setGeneratedKey(Object idValue) { } - /** - * False for CallableSql. - */ - public boolean useGeneratedKeys() { - return false; - } - /** * Perform post execute processing for the CallableSql. */ @@ -98,6 +91,8 @@ public final class PersistRequestCallableSql extends PersistRequest { if (tableEvents != null && !tableEvents.isEmpty()) { transaction.getEvent().add(tableEvents); + } else { + transaction.markNotQueryOnly(); } } @@ -141,7 +136,7 @@ public final class PersistRequestCallableSql extends PersistRequest { for (int i = 0; i < list.size(); i++) { pos++; - BindParams.Param param = (BindParams.Param) list.get(i); + BindParams.Param param = list.get(i); if (param.isOutParam()) { Object outValue = cstmt.getObject(pos); param.setOutValue(outValue); 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 64ea8167e..f6485b4fe 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/transaction/JdbcTransaction.java +++ b/src/main/java/com/avaje/ebeaninternal/server/transaction/JdbcTransaction.java @@ -361,6 +361,11 @@ public class JdbcTransaction implements SpiTransaction { return depth; } + @Override + public void markNotQueryOnly() { + this.queryOnly = false; + } + @Override public boolean isReadOnly() { if (!isActive()) { diff --git a/src/test/java/com/avaje/tests/callable/TestMysqlCallable.java b/src/test/java/com/avaje/tests/callable/TestMysqlCallable.java new file mode 100644 index 000000000..97cec9aba --- /dev/null +++ b/src/test/java/com/avaje/tests/callable/TestMysqlCallable.java @@ -0,0 +1,55 @@ +package com.avaje.tests.callable; + +import com.avaje.ebean.BaseTestCase; +import com.avaje.ebean.CallableSql; +import com.avaje.ebean.Ebean; +import com.avaje.ebean.EbeanServer; +import com.avaje.tests.model.basic.EBasic; +import org.junit.Ignore; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class TestMysqlCallable extends BaseTestCase { + +// drop procedure my_stored_procedure if exists; +// + /* + + DELIMITER // + create procedure my_stored_procedure(in v_id integer, in v_name varchar(100)) + begin + update e_basic set name = v_name where id = v_id; + end; + // + +*/ + + /** + * Only run this test manually against MySQL with the above stored procedure. + */ + @Ignore + @Test + public void test() { + + // mysql specific test + EbeanServer server = Ebean.getServer("mysql"); + + EBasic basic = new EBasic(); + basic.setName("calling"); + server.save(basic); + + CallableSql cs = server.createCallableSql("{call my_stored_procedure(?,?)}"); + cs.setParameter(1, basic.getId()); + cs.setParameter(2, "modBySP"); + // without addModification() need to confirm transaction treated as not query only + //cs.addModification("e_basic", false, true, false); + server.execute(cs); + + + EBasic basic1 = server.find(EBasic.class, basic.getId()); + + assertEquals("modBySP", basic1.getName()); + } + +}