From 4e1f817adef95b128c7b6f6eea8907ad10ef943b Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Tue, 22 Jan 2019 21:54:03 +1300 Subject: [PATCH] #1617 - save() on a reference bean causes insert to occur ... results in duplicate key exception Tests that reproduce the issue (supplied by Andre - thanks for that) --- src/test/java/org/tests/o2o/OtoLevelA.java | 39 +++++++++++++++++++ src/test/java/org/tests/o2o/OtoLevelB.java | 38 ++++++++++++++++++ src/test/java/org/tests/o2o/OtoLevelC.java | 17 ++++++++ .../o2o/TestOneToOneSaveWithoutChanges.java | 36 +++++++++++++++++ .../java/org/tests/o2o/TestReferenceSave.java | 28 +++++++++++++ 5 files changed, 158 insertions(+) create mode 100644 src/test/java/org/tests/o2o/OtoLevelA.java create mode 100644 src/test/java/org/tests/o2o/OtoLevelB.java create mode 100644 src/test/java/org/tests/o2o/OtoLevelC.java create mode 100644 src/test/java/org/tests/o2o/TestOneToOneSaveWithoutChanges.java create mode 100644 src/test/java/org/tests/o2o/TestReferenceSave.java diff --git a/src/test/java/org/tests/o2o/OtoLevelA.java b/src/test/java/org/tests/o2o/OtoLevelA.java new file mode 100644 index 000000000..6be6928fd --- /dev/null +++ b/src/test/java/org/tests/o2o/OtoLevelA.java @@ -0,0 +1,39 @@ +package org.tests.o2o; + + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToOne; + +@Entity +public class OtoLevelA { + + @Id + private Long id; + + private final String name; + + @OneToOne(cascade = CascadeType.ALL) + private OtoLevelB b; + + public OtoLevelA(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public OtoLevelB getB() { + return b; + } + + public void setB(OtoLevelB b) { + this.b = b; + } +} diff --git a/src/test/java/org/tests/o2o/OtoLevelB.java b/src/test/java/org/tests/o2o/OtoLevelB.java new file mode 100644 index 000000000..5f7899cbf --- /dev/null +++ b/src/test/java/org/tests/o2o/OtoLevelB.java @@ -0,0 +1,38 @@ +package org.tests.o2o; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToOne; + +@Entity +public class OtoLevelB { + + @Id + private Long id; + + private final String name; + + @OneToOne(cascade = CascadeType.ALL) + private OtoLevelC c; + + public OtoLevelB(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public OtoLevelC getC() { + return c; + } + + public void setC(OtoLevelC c) { + this.c = c; + } +} diff --git a/src/test/java/org/tests/o2o/OtoLevelC.java b/src/test/java/org/tests/o2o/OtoLevelC.java new file mode 100644 index 000000000..b5caa688e --- /dev/null +++ b/src/test/java/org/tests/o2o/OtoLevelC.java @@ -0,0 +1,17 @@ +package org.tests.o2o; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class OtoLevelC { + + @Id + private Long id; + + private final String name; + + public OtoLevelC(String name) { + this.name = name; + } +} diff --git a/src/test/java/org/tests/o2o/TestOneToOneSaveWithoutChanges.java b/src/test/java/org/tests/o2o/TestOneToOneSaveWithoutChanges.java new file mode 100644 index 000000000..a80277abd --- /dev/null +++ b/src/test/java/org/tests/o2o/TestOneToOneSaveWithoutChanges.java @@ -0,0 +1,36 @@ +package org.tests.o2o; + + +import io.ebean.Ebean; +import org.ebeantest.LoggedSqlCollector; +import org.junit.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestOneToOneSaveWithoutChanges { + + @Test + public void testSave3Levels() { + + OtoLevelA a = new OtoLevelA("A"); + a.setB(new OtoLevelB("B")); + a.getB().setC(new OtoLevelC("C")); + + Ebean.save(a); + + OtoLevelA dbA = Ebean.find(OtoLevelA.class, 1); + OtoLevelB dbB = dbA.getB(); + OtoLevelC dbC = dbB.getC(); + + LoggedSqlCollector.start(); + + Ebean.save(dbA); + Ebean.save(dbB); + Ebean.save(dbC); + + List sql = LoggedSqlCollector.stop(); + assertThat(sql).hasSize(0); + } +} diff --git a/src/test/java/org/tests/o2o/TestReferenceSave.java b/src/test/java/org/tests/o2o/TestReferenceSave.java new file mode 100644 index 000000000..11d3bd9f2 --- /dev/null +++ b/src/test/java/org/tests/o2o/TestReferenceSave.java @@ -0,0 +1,28 @@ +package org.tests.o2o; + + +import io.ebean.Ebean; +import org.ebeantest.LoggedSqlCollector; +import org.junit.Test; +import org.tests.update.EPersonOnline; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestReferenceSave { + + @Test + public void test() { + + Ebean.getDefaultServer(); + + LoggedSqlCollector.start(); + + EPersonOnline bean = Ebean.getReference(EPersonOnline.class, 1L); + Ebean.save(bean); + + List sql = LoggedSqlCollector.current(); + assertThat(sql).hasSize(0); + } +}