diff --git a/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java b/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java index dcee6530f..d71d7e9cd 100644 --- a/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java +++ b/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java @@ -31,6 +31,7 @@ import io.ebeanservice.docstore.api.DocStoreUpdate; import io.ebeanservice.docstore.api.DocStoreUpdateContext; import io.ebeanservice.docstore.api.DocStoreUpdates; +import javax.persistence.EntityNotFoundException; import javax.persistence.OptimisticLockException; import javax.persistence.PersistenceException; import java.io.IOException; @@ -854,12 +855,11 @@ public final class PersistRequestBean extends PersistRequest implements BeanP */ @Override public final void checkRowCount(int rowCount) { - if (ConcurrencyMode.VERSION == concurrencyMode && rowCount != 1) { - // fix for oracle. - // see: https://stackoverflow.com/questions/19022175/executebatch-method-return-array-of-value-2-in-java - if (rowCount != Statement.SUCCESS_NO_INFO) { - String m = Message.msg("persist.conc2", String.valueOf(rowCount)); - throw new OptimisticLockException(m, null, bean); + if (rowCount != 1 && rowCount != Statement.SUCCESS_NO_INFO) { + if (ConcurrencyMode.VERSION == concurrencyMode) { + throw new OptimisticLockException(Message.msg("persist.conc2", String.valueOf(rowCount)), null, bean); + } else if (rowCount == 0 && type == Type.UPDATE) { + throw new EntityNotFoundException("No rows updated"); } } switch (type) { diff --git a/src/main/java/io/ebeaninternal/server/persist/dml/DmlHandler.java b/src/main/java/io/ebeaninternal/server/persist/dml/DmlHandler.java index a90e3198b..ea1a05087 100644 --- a/src/main/java/io/ebeaninternal/server/persist/dml/DmlHandler.java +++ b/src/main/java/io/ebeaninternal/server/persist/dml/DmlHandler.java @@ -7,7 +7,6 @@ import io.ebeaninternal.server.lib.util.Str; import io.ebeaninternal.server.persist.BatchedPstmt; import io.ebeaninternal.server.persist.BatchedPstmtHolder; import io.ebeaninternal.server.persist.dmlbind.BindableRequest; -import io.ebeaninternal.server.transaction.TransactionManager; import io.ebeaninternal.server.type.DataBind; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/test/java/org/tests/update/TestStatelessUpdate.java b/src/test/java/org/tests/update/TestStatelessUpdate.java index 184248b88..7a3376adf 100644 --- a/src/test/java/org/tests/update/TestStatelessUpdate.java +++ b/src/test/java/org/tests/update/TestStatelessUpdate.java @@ -11,6 +11,7 @@ import org.tests.model.basic.EBasic.Status; import org.junit.Assert; import org.junit.Test; +import javax.persistence.EntityNotFoundException; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashSet; @@ -70,6 +71,28 @@ public class TestStatelessUpdate extends TransactionalTestCase { } + @Test(expected = EntityNotFoundException.class) + public void update_NoRowsUpdated_expect_EntityNotFoundException() { + + EBasic basic = new EBasic(); + basic.setId(999999999); + basic.setName("something"); + basic.setStatus(Status.ACTIVE); + + Ebean.update(basic); + } + + @Test + public void delete_NoRowsDeleted_expect_false() { + + EBasic basic = new EBasic(); + basic.setId(999999999); + basic.setName("something"); + basic.setStatus(Status.ACTIVE); + + assertThat(Ebean.delete(basic)).isFalse(); + } + /** * I am expecting that Ebean detects there aren't any changes and don't execute any query. * Currently a {@link javax.persistence.PersistenceException} with message 'Invalid value "null" for parameter "SQL"' is thrown.