From eba521563abba40e8fdcd852e1b77d18c169c4a7 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Sun, 30 Jun 2019 19:37:49 +1200 Subject: [PATCH] #1739 - Entity with just @Id and @OneToMany fields produces broken insert query --- .../server/persist/dml/InsertMeta.java | 16 ++++++++-- .../server/persist/dmlbind/BindableList.java | 4 +++ .../java/org/tests/insert/OnlyIdEntity.java | 19 +++++++++++ .../org/tests/insert/TestOnlyIdEntity.java | 32 +++++++++++++++++++ 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/tests/insert/OnlyIdEntity.java create mode 100644 src/test/java/org/tests/insert/TestOnlyIdEntity.java diff --git a/src/main/java/io/ebeaninternal/server/persist/dml/InsertMeta.java b/src/main/java/io/ebeaninternal/server/persist/dml/InsertMeta.java index d38ae2952..58f9559c0 100644 --- a/src/main/java/io/ebeaninternal/server/persist/dml/InsertMeta.java +++ b/src/main/java/io/ebeaninternal/server/persist/dml/InsertMeta.java @@ -177,8 +177,12 @@ public final class InsertMeta { request.setInsertSetMode(); request.append("insert into ").append(table); - request.append(" ("); + if (nullId && noColumnsForInsert(draftTable)) { + request.append(" default values"); + return request.toString(); + } + request.append(" ("); if (!nullId) { id.dmlAppend(request); } @@ -200,8 +204,16 @@ public final class InsertMeta { request.append(") values ("); request.append(request.getInsertBindBuffer()); request.append(")"); - return request.toString(); } + /** + * Return true if the insert actually contains no columns. + */ + private boolean noColumnsForInsert(boolean draftTable) { + return shadowFKey == null + && discriminator == null + && (draftTable ? all.isEmpty() : allExcludeDraftOnly.isEmpty()); + } + } diff --git a/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableList.java b/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableList.java index e09e9e706..de6957ad1 100644 --- a/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableList.java +++ b/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableList.java @@ -33,6 +33,10 @@ public class BindableList implements Bindable { return new BindableList(copy); } + public boolean isEmpty() { + return items.length == 0; + } + @Override public boolean isDraftOnly() { return false; diff --git a/src/test/java/org/tests/insert/OnlyIdEntity.java b/src/test/java/org/tests/insert/OnlyIdEntity.java new file mode 100644 index 000000000..c251efd5a --- /dev/null +++ b/src/test/java/org/tests/insert/OnlyIdEntity.java @@ -0,0 +1,19 @@ +package org.tests.insert; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class OnlyIdEntity { + + @Id + long id; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } +} diff --git a/src/test/java/org/tests/insert/TestOnlyIdEntity.java b/src/test/java/org/tests/insert/TestOnlyIdEntity.java new file mode 100644 index 000000000..c0dff68e9 --- /dev/null +++ b/src/test/java/org/tests/insert/TestOnlyIdEntity.java @@ -0,0 +1,32 @@ +package org.tests.insert; + +import io.ebean.DB; +import io.ebean.Database; +import io.ebean.annotation.ForPlatform; +import io.ebean.annotation.Platform; +import org.ebeantest.LoggedSqlCollector; +import org.junit.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestOnlyIdEntity { + + @ForPlatform({Platform.H2, Platform.POSTGRES}) + @Test + public void insert() { + + final Database database = DB.getDefault(); + + LoggedSqlCollector.start(); + OnlyIdEntity bean = new OnlyIdEntity(); + database.save(bean); + + List sql = LoggedSqlCollector.stop(); + + assertThat(bean.getId()).isGreaterThan(0); + assertThat(sql).hasSize(1); + assertThat(sql.get(0)).contains("insert into only_id_entity default values"); + } +}