From fa2c5c058496f4746e9eb663abb03f70cc7c60ae Mon Sep 17 00:00:00 2001 From: maTrojak <35736836+maTrojak@users.noreply.github.com> Date: Wed, 15 Dec 2021 08:13:16 +0100 Subject: [PATCH] recalc lazyload duplicate key (#53) --- .../server/core/PersistRequestBean.java | 7 +- .../java/org/tests/o2o/OtoLevelALazy.java | 44 +++++++++++ .../java/org/tests/o2o/OtoLevelBLazy.java | 76 +++++++++++++++++++ .../o2o/TestOneToOneSaveWithoutChanges.java | 24 +++++- 4 files changed, 145 insertions(+), 6 deletions(-) create mode 100644 ebean-test/src/test/java/org/tests/o2o/OtoLevelALazy.java create mode 100644 ebean-test/src/test/java/org/tests/o2o/OtoLevelBLazy.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 78543e7aa..77651c53a 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 @@ -147,10 +147,13 @@ public final class PersistRequestBean extends PersistRequest implements BeanP PersistExecute persistExecute, PersistRequest.Type type, int flags) { super(server, t, persistExecute); this.entityBean = (EntityBean) bean; - this.entityBean._ebean_onPersistTrigger(type.profileEventId); this.intercept = entityBean._ebean_getIntercept(); - this.beanManager = mgr; this.beanDescriptor = mgr.getBeanDescriptor(); + boolean isReference = beanDescriptor.isReference(intercept); + if(!isReference) { + this.entityBean._ebean_onPersistTrigger(type.profileEventId); + } + this.beanManager = mgr; this.beanPersistListener = beanDescriptor.persistListener(); this.bean = bean; this.parentBean = parentBean; diff --git a/ebean-test/src/test/java/org/tests/o2o/OtoLevelALazy.java b/ebean-test/src/test/java/org/tests/o2o/OtoLevelALazy.java new file mode 100644 index 000000000..0c5355b5f --- /dev/null +++ b/ebean-test/src/test/java/org/tests/o2o/OtoLevelALazy.java @@ -0,0 +1,44 @@ +package org.tests.o2o; + + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.OneToOne; + +@Entity +public class OtoLevelALazy { + + @Id + private Long id; + + private String name; + + @OneToOne(mappedBy = "a", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) + private OtoLevelBLazy b; + + public OtoLevelALazy(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public OtoLevelBLazy getB() { + return b; + } + + public void setB(OtoLevelBLazy b) { + this.b = b; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/ebean-test/src/test/java/org/tests/o2o/OtoLevelBLazy.java b/ebean-test/src/test/java/org/tests/o2o/OtoLevelBLazy.java new file mode 100644 index 000000000..67136a87d --- /dev/null +++ b/ebean-test/src/test/java/org/tests/o2o/OtoLevelBLazy.java @@ -0,0 +1,76 @@ +package org.tests.o2o; + +import java.util.List; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.ManyToMany; +import javax.persistence.OneToOne; + +@Entity +public class OtoLevelBLazy { + + @Id + private Long id; + + private String name; + + @ManyToMany() + private List c; + + @OneToOne() + private OtoLevelALazy a; + + @Lob + private String blob; + + public OtoLevelBLazy(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public OtoLevelALazy getA() { + return a; + } + + public void setA(OtoLevelALazy a) { + this.a = a; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getC() { + return c; + } + + public final void _ebean_onPersistTrigger(String trt) { + recalc(); + } + + protected void recalc() { + this.getBlob(); + } + + public String getBlob() { + return blob; + } + + public void setBlob(String blob) { + this.blob = blob; + } + +} diff --git a/ebean-test/src/test/java/org/tests/o2o/TestOneToOneSaveWithoutChanges.java b/ebean-test/src/test/java/org/tests/o2o/TestOneToOneSaveWithoutChanges.java index 5621d4ce8..c48fe0677 100644 --- a/ebean-test/src/test/java/org/tests/o2o/TestOneToOneSaveWithoutChanges.java +++ b/ebean-test/src/test/java/org/tests/o2o/TestOneToOneSaveWithoutChanges.java @@ -1,13 +1,14 @@ package org.tests.o2o; -import io.ebean.DB; -import io.ebean.test.LoggedSql; -import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; +import org.junit.jupiter.api.Test; + +import io.ebean.DB; +import io.ebean.test.LoggedSql; public class TestOneToOneSaveWithoutChanges { @@ -33,4 +34,19 @@ public class TestOneToOneSaveWithoutChanges { List sql = LoggedSql.stop(); assertThat(sql).hasSize(0); } + + @Test + public void testSave2LevelsLazyPersistTrigger() { + OtoLevelALazy a = new OtoLevelALazy("A"); + OtoLevelBLazy b = new OtoLevelBLazy("B"); + b.setA(a); + DB.save(a); + DB.save(b); + + OtoLevelALazy dbA = DB.find(OtoLevelALazy.class).select("*").where().idEq(1).findList().get(0); + LoggedSql.start(); + DB.save(dbA); + List sql = LoggedSql.stop(); + assertThat(sql).hasSize(0); + } }