#1396 merge() with ManyToMany throwing error Referential integrity constraint violation

This commit is contained in:
rob bygrave
2018-05-30 03:32:38 +12:00
parent 23e5de0819
commit 7f9ce5bdd4
4 changed files with 172 additions and 0 deletions
+34
View File
@@ -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;
}
}
@@ -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<MGroup> 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<MGroup> getGroups() {
return groups;
}
public void setGroups(List<MGroup> groups) {
this.groups = groups;
}
}
@@ -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<String> 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.
*/
@@ -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<String> 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");
}
}