#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)
This commit is contained in:
rob bygrave
2019-01-22 21:54:03 +13:00
parent d4139aa8ef
commit 4e1f817ade
5 changed files with 158 additions and 0 deletions
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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<String> sql = LoggedSqlCollector.stop();
assertThat(sql).hasSize(0);
}
}
@@ -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<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(0);
}
}