From 7f9ce5bdd4c20b2dfd0b69c78b9a34436f87b2e4 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Wed, 30 May 2018 03:32:38 +1200 Subject: [PATCH] #1396 merge() with ManyToMany throwing error Referential integrity constraint violation --- src/test/java/org/tests/merge/MGroup.java | 34 ++++++++++ src/test/java/org/tests/merge/MMachine.java | 59 +++++++++++++++++ .../org/tests/merge/TestMergeCustomer.java | 15 +++++ .../java/org/tests/merge/TestMergeM2M.java | 64 +++++++++++++++++++ 4 files changed, 172 insertions(+) create mode 100644 src/test/java/org/tests/merge/MGroup.java create mode 100644 src/test/java/org/tests/merge/MMachine.java create mode 100644 src/test/java/org/tests/merge/TestMergeM2M.java diff --git a/src/test/java/org/tests/merge/MGroup.java b/src/test/java/org/tests/merge/MGroup.java new file mode 100644 index 000000000..06b7cb601 --- /dev/null +++ b/src/test/java/org/tests/merge/MGroup.java @@ -0,0 +1,34 @@ +package org.tests.merge; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class MGroup { + + @Id + private long id; + + private String name; + + public MGroup(long id, String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/test/java/org/tests/merge/MMachine.java b/src/test/java/org/tests/merge/MMachine.java new file mode 100644 index 000000000..896da51a1 --- /dev/null +++ b/src/test/java/org/tests/merge/MMachine.java @@ -0,0 +1,59 @@ +package org.tests.merge; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToMany; +import javax.persistence.Version; +import java.util.ArrayList; +import java.util.List; + +@Entity +public class MMachine { + + @Id + private long id; + + private String name; + + @ManyToMany + private List groups = new ArrayList<>(); + + @Version + private long version; + + public MMachine(String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } + + public List getGroups() { + return groups; + } + + public void setGroups(List groups) { + this.groups = groups; + } +} diff --git a/src/test/java/org/tests/merge/TestMergeCustomer.java b/src/test/java/org/tests/merge/TestMergeCustomer.java index 7bf86d1d8..c796d702b 100644 --- a/src/test/java/org/tests/merge/TestMergeCustomer.java +++ b/src/test/java/org/tests/merge/TestMergeCustomer.java @@ -20,6 +20,21 @@ public class TestMergeCustomer extends BaseTestCase { private Random random = new Random(); + @Test + public void customerOnly_defaultOptions_expect_updateOnly() { + + MCustomer mCustomer = partial("cust1", "(id,name,version)"); + mCustomer.setName("NotCust0"); + + LoggedSqlCollector.start(); + + Ebean.merge(mCustomer); + + List sql = LoggedSqlCollector.stop(); + assertThat(sql).hasSize(1); + assertThat(sql.get(0)).contains("update mcustomer set name=?, version=? where id=? and version=?"); + } + /** * So this is effectively the same as a stateless update. */ diff --git a/src/test/java/org/tests/merge/TestMergeM2M.java b/src/test/java/org/tests/merge/TestMergeM2M.java new file mode 100644 index 000000000..930d2def1 --- /dev/null +++ b/src/test/java/org/tests/merge/TestMergeM2M.java @@ -0,0 +1,64 @@ +package org.tests.merge; + +import io.ebean.BaseTestCase; +import io.ebean.Ebean; +import io.ebean.MergeOptions; +import io.ebean.MergeOptionsBuilder; +import org.ebeantest.LoggedSqlCollector; +import org.junit.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestMergeM2M extends BaseTestCase { + + @Test + public void m2mMerge() { + + MGroup group1 = new MGroup(1, "gone"); + MGroup group2 = new MGroup(2, "gtwo"); + MGroup group3 = new MGroup(3, "gthree"); + MGroup group4 = new MGroup(4, "gfour"); + MGroup group5 = new MGroup(5, "gfive"); + + Ebean.save(group1); + Ebean.save(group2); + Ebean.save(group3); + Ebean.save(group4); + Ebean.save(group5); + + MMachine machine = new MMachine("mac1"); + machine.getGroups().add(group1); + machine.getGroups().add(group2); + machine.getGroups().add(group3); + + MergeOptions options = new MergeOptionsBuilder().addPath("groups").build(); + + LoggedSqlCollector.start(); + + Ebean.merge(machine, options); + + List sql = LoggedSqlCollector.current(); + assertThat(sql).hasSize(3); + assertThat(sql.get(0)).contains("select"); + assertThat(sql.get(1)).contains("insert into mmachine"); + assertThat(sql.get(2)).contains("insert into mmachine_mgroup"); + + machine.setName("mac1-mod"); + machine.getGroups().remove(group2); + machine.getGroups().remove(group3); + machine.getGroups().add(group4); + machine.getGroups().add(group5); + + Ebean.merge(machine, options); + + sql = LoggedSqlCollector.current(); + assertThat(sql).hasSize(4); + assertThat(sql.get(0)).contains("select"); + assertThat(sql.get(1)).contains("delete from mmachine_mgroup"); + assertThat(sql.get(2)).contains("insert into mmachine_mgroup"); + assertThat(sql.get(3)).contains("update mmachine"); + + } +}