From bb1275f4f95aa43c34b392791b419f2e673bb6dc Mon Sep 17 00:00:00 2001 From: rbygrave Date: Tue, 6 Apr 2021 21:13:59 +1200 Subject: [PATCH] #2217 - Inserting an entity bean is skipped with a String @Id property and no other properties set --- .../server/core/PersistRequestBean.java | 7 ++ .../server/deploy/BeanDescriptor.java | 2 +- .../server/persist/DefaultPersister.java | 2 +- .../cache/personinfo/PersonCacheEmail.java | 4 + .../tests/cache/personinfo/PersonOther.java | 73 +++++++++++++++++++ .../cache/personinfo/TestStringIdOnly.java | 30 ++++++++ 6 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 ebean-core/src/test/java/org/tests/cache/personinfo/PersonOther.java create mode 100644 ebean-core/src/test/java/org/tests/cache/personinfo/TestStringIdOnly.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java index eb48fc2ef..01c27fa0f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java @@ -1032,6 +1032,13 @@ public final class PersistRequestBean extends PersistRequest implements BeanP } } + /** + * Return if persist can be skipped on the reference only bean. + */ + public boolean isSkipReference() { + return intercept.isReference() || (Flags.isRecurse(flags) && beanDescriptor.referenceIdPropertyOnly(intercept)); + } + public boolean isReference() { return beanDescriptor.isReference(intercept); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index a2d902f13..2e0e00b65 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -3134,7 +3134,7 @@ public class BeanDescriptor implements BeanType, STreeType { return ebi.isReference() || referenceIdPropertyOnly(ebi); } - boolean referenceIdPropertyOnly(EntityBeanIntercept ebi) { + public boolean referenceIdPropertyOnly(EntityBeanIntercept ebi) { return idOnlyReference && ebi.hasIdOnly(idPropertyIndex); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java index a7b21f0c8..935fbb6b8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java @@ -447,7 +447,7 @@ public final class DefaultPersister implements Persister { public void insert(EntityBean bean, Transaction t) { PersistRequestBean req = createRequest(bean, t, PersistRequest.Type.INSERT); - if (req.isReference()) { + if (req.isSkipReference()) { // skip insert on reference bean return; } diff --git a/ebean-core/src/test/java/org/tests/cache/personinfo/PersonCacheEmail.java b/ebean-core/src/test/java/org/tests/cache/personinfo/PersonCacheEmail.java index 58ddea0a2..144253edf 100644 --- a/ebean-core/src/test/java/org/tests/cache/personinfo/PersonCacheEmail.java +++ b/ebean-core/src/test/java/org/tests/cache/personinfo/PersonCacheEmail.java @@ -25,6 +25,10 @@ public class PersonCacheEmail { this.email = email; } + public PersonCacheEmail(String id) { + this.id = id; + } + public String getId() { return id; } diff --git a/ebean-core/src/test/java/org/tests/cache/personinfo/PersonOther.java b/ebean-core/src/test/java/org/tests/cache/personinfo/PersonOther.java new file mode 100644 index 000000000..b4b505125 --- /dev/null +++ b/ebean-core/src/test/java/org/tests/cache/personinfo/PersonOther.java @@ -0,0 +1,73 @@ +package org.tests.cache.personinfo; + +import io.ebean.annotation.WhenCreated; +import io.ebean.annotation.WhenModified; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Version; +import javax.validation.constraints.Size; +import java.time.Instant; + +@Entity +public class PersonOther { + + @Id + @Size(max=128) + private String id; + + private String email; + + @WhenCreated + private Instant whenCreated; + + @WhenModified + private Instant whenModified; + + @Version + private long version; + + public PersonOther(String id) { + this.id = id; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Instant getWhenCreated() { + return whenCreated; + } + + public void setWhenCreated(Instant whenCreated) { + this.whenCreated = whenCreated; + } + + public Instant getWhenModified() { + return whenModified; + } + + public void setWhenModified(Instant whenModified) { + this.whenModified = whenModified; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } +} diff --git a/ebean-core/src/test/java/org/tests/cache/personinfo/TestStringIdOnly.java b/ebean-core/src/test/java/org/tests/cache/personinfo/TestStringIdOnly.java new file mode 100644 index 000000000..6379491ff --- /dev/null +++ b/ebean-core/src/test/java/org/tests/cache/personinfo/TestStringIdOnly.java @@ -0,0 +1,30 @@ +package org.tests.cache.personinfo; + +import io.ebean.BaseTestCase; +import io.ebean.DB; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestStringIdOnly extends BaseTestCase { + + @Test + public void insert() { + + PersonCacheEmail b0 = new PersonCacheEmail("IdOnly"); + DB.save(b0); + + PersonCacheEmail found = DB.find(PersonCacheEmail.class, b0.getId()); + assertThat(found).isNotNull(); + } + + @Test + public void insert_whenIdOnly() { + + PersonOther b0 = new PersonOther("IdOnly"); + DB.save(b0); + + PersonOther found = DB.find(PersonOther.class, b0.getId()); + assertThat(found).isNotNull(); + } +}