From 854471244838c57aa17dad0091777bf829a4ca59 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Wed, 9 Jan 2019 12:29:28 +1300 Subject: [PATCH] #1606 - Bean with Inheritance and OneToMany with JoinTable and cascade ... doesn't cascade save on all bean types --- .../server/persist/SaveManyBeans.java | 3 + .../TestOneToManyJoinTableInheritance.java | 55 +++++++++++++++++++ .../o2m/jointable/inheritance/ClassA.java | 7 +++ .../o2m/jointable/inheritance/ClassB.java | 7 +++ .../o2m/jointable/inheritance/ClassSuper.java | 26 +++++++++ 5 files changed, 98 insertions(+) create mode 100644 src/test/java/org/tests/o2m/jointable/TestOneToManyJoinTableInheritance.java create mode 100644 src/test/java/org/tests/o2m/jointable/inheritance/ClassA.java create mode 100644 src/test/java/org/tests/o2m/jointable/inheritance/ClassB.java create mode 100644 src/test/java/org/tests/o2m/jointable/inheritance/ClassSuper.java diff --git a/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java b/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java index 8190e0726..7722d2a39 100644 --- a/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java +++ b/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java @@ -84,6 +84,9 @@ class SaveManyBeans extends SaveManyBase { } private boolean isSaveIntersection() { + if (!many.isManyToMany()) { + return true; + } return transaction.isSaveAssocManyIntersection(many.getIntersectionTableJoin().getTable(), many.getBeanDescriptor().getName()); } diff --git a/src/test/java/org/tests/o2m/jointable/TestOneToManyJoinTableInheritance.java b/src/test/java/org/tests/o2m/jointable/TestOneToManyJoinTableInheritance.java new file mode 100644 index 000000000..5468434bc --- /dev/null +++ b/src/test/java/org/tests/o2m/jointable/TestOneToManyJoinTableInheritance.java @@ -0,0 +1,55 @@ +package org.tests.o2m.jointable; + +import io.ebean.BaseTestCase; +import io.ebean.Ebean; +import org.ebeantest.LoggedSqlCollector; +import org.junit.Test; +import org.tests.o2m.jointable.inheritance.ClassA; +import org.tests.o2m.jointable.inheritance.ClassB; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestOneToManyJoinTableInheritance extends BaseTestCase { + + private JtMonkey m0 = new JtMonkey("Sim"); + private JtMonkey m1 = new JtMonkey("Tim"); + private JtMonkey m2 = new JtMonkey("Uim"); + + private ClassA classA = new ClassA(); + private ClassB classB = new ClassB(); + + @Test + public void testSave() { + + classA.getMonkeys().add(m0); + classA.getMonkeys().add(m1); + classB.getMonkeys().add(m2); + + LoggedSqlCollector.start(); + + Ebean.saveAll(Arrays.asList(classA, classB)); + + List sql = LoggedSqlCollector.current(); + + assertThat(sql).hasSize(7); + assertThat(sql.get(0)).contains("insert into class_super "); + assertThat(sql.get(1)).contains("insert into monkey "); + assertThat(sql.get(2)).contains("insert into monkey "); + assertThat(sql.get(3)).contains("insert into class_super_monkey "); + assertThat(sql.get(4)).contains("insert into class_super "); + assertThat(sql.get(5)).contains("insert into monkey "); + assertThat(sql.get(6)).contains("insert into class_super_monkey "); + + ClassA dbA = Ebean.find(ClassA.class, 1); + ClassB dbB = Ebean.find(ClassB.class, 2); + + assertThat(dbA.getMonkeys()).hasSize(2); + assertThat(dbB.getMonkeys()).hasSize(1); + assertThat(dbA.getMonkeys().get(0).name).isEqualTo("Sim"); + assertThat(dbA.getMonkeys().get(1).name).isEqualTo("Tim"); + assertThat(dbB.getMonkeys().get(0).name).isEqualTo("Uim"); + } +} diff --git a/src/test/java/org/tests/o2m/jointable/inheritance/ClassA.java b/src/test/java/org/tests/o2m/jointable/inheritance/ClassA.java new file mode 100644 index 000000000..14644d200 --- /dev/null +++ b/src/test/java/org/tests/o2m/jointable/inheritance/ClassA.java @@ -0,0 +1,7 @@ +package org.tests.o2m.jointable.inheritance; + +import javax.persistence.Entity; + +@Entity +public class ClassA extends ClassSuper { +} diff --git a/src/test/java/org/tests/o2m/jointable/inheritance/ClassB.java b/src/test/java/org/tests/o2m/jointable/inheritance/ClassB.java new file mode 100644 index 000000000..305b33999 --- /dev/null +++ b/src/test/java/org/tests/o2m/jointable/inheritance/ClassB.java @@ -0,0 +1,7 @@ +package org.tests.o2m.jointable.inheritance; + +import javax.persistence.Entity; + +@Entity +public class ClassB extends ClassSuper { +} diff --git a/src/test/java/org/tests/o2m/jointable/inheritance/ClassSuper.java b/src/test/java/org/tests/o2m/jointable/inheritance/ClassSuper.java new file mode 100644 index 000000000..08d3bbf54 --- /dev/null +++ b/src/test/java/org/tests/o2m/jointable/inheritance/ClassSuper.java @@ -0,0 +1,26 @@ +package org.tests.o2m.jointable.inheritance; + +import org.tests.o2m.jointable.JtMonkey; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.JoinTable; +import javax.persistence.OneToMany; +import java.util.List; + +@Inheritance +@Entity +public abstract class ClassSuper { + @Id + long sid; + + @JoinTable + @OneToMany(cascade = CascadeType.ALL) + private List monkeys; + + public List getMonkeys() { + return monkeys; + } +}