From dac55ab8e9b87320ed1707d6ff0a19474db01be6 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Fri, 18 Oct 2019 15:35:21 +1300 Subject: [PATCH] #1847 - Delete bean with ManyToMany to always delete from intersection (not required cascade REMOVE) --- .../server/deploy/BeanPropertyAssocMany.java | 2 +- .../org/tests/inheritance/TestSkippable.java | 2 + .../org/tests/m2m/TestM2MDeleteNoCascade.java | 49 ++++++++++--------- .../java/org/tests/model/basic/MnocRole.java | 9 +++- .../java/org/tests/model/basic/MnocUser.java | 6 +-- 5 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index 06e2b61ec..48e12475e 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -956,7 +956,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST } public boolean isIncludeCascadeDelete() { - return cascadeInfo.isDelete() || o2mJoinTable || ModifyListenMode.REMOVALS == modifyListenMode; + return cascadeInfo.isDelete() || hasJoinTable() || ModifyListenMode.REMOVALS == modifyListenMode; } boolean isCascadeDeleteEscalate() { diff --git a/src/test/java/org/tests/inheritance/TestSkippable.java b/src/test/java/org/tests/inheritance/TestSkippable.java index 40cbb2265..9f5448823 100644 --- a/src/test/java/org/tests/inheritance/TestSkippable.java +++ b/src/test/java/org/tests/inheritance/TestSkippable.java @@ -68,5 +68,7 @@ public class TestSkippable extends BaseTestCase { Assert.assertEquals(value2.getId(), value2_DB_2.getId()); Assert.assertTrue("Cascade failed", value2.getId().equals(value2_DB_2.getId())); + Ebean.delete(listAttributeDB_2); + } } diff --git a/src/test/java/org/tests/m2m/TestM2MDeleteNoCascade.java b/src/test/java/org/tests/m2m/TestM2MDeleteNoCascade.java index dcb4f984e..a125042fe 100644 --- a/src/test/java/org/tests/m2m/TestM2MDeleteNoCascade.java +++ b/src/test/java/org/tests/m2m/TestM2MDeleteNoCascade.java @@ -4,26 +4,33 @@ import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.annotation.IgnorePlatform; import io.ebean.annotation.Platform; +import org.ebeantest.LoggedSqlCollector; +import org.junit.BeforeClass; +import org.junit.Test; import org.tests.model.basic.MnocRole; import org.tests.model.basic.MnocUser; -import org.junit.Assert; -import org.junit.Test; -import javax.persistence.PersistenceException; import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; + public class TestM2MDeleteNoCascade extends BaseTestCase { + private static MnocRole r0 = new MnocRole("r0"); + private static MnocRole r1 = new MnocRole("r1"); + private static MnocRole r2 = new MnocRole("r2"); + + @BeforeClass + public static void setup() { + Ebean.save(r0); + Ebean.save(r1); + Ebean.save(r2); + } + @IgnorePlatform(Platform.NUODB) @Test public void test() { - MnocRole r0 = new MnocRole("r0"); - MnocRole r1 = new MnocRole("r0"); - - Ebean.save(r0); - Ebean.save(r1); - MnocUser u0 = new MnocUser("usr0"); u0.addValidRole(r0); u0.addValidRole(r1); @@ -32,21 +39,17 @@ public class TestM2MDeleteNoCascade extends BaseTestCase { MnocUser loadedUser = Ebean.find(MnocUser.class, u0.getUserId()); List validRoles = loadedUser.getValidRoles(); + assertThat(validRoles).hasSize(2); - Assert.assertEquals(2, validRoles.size()); - - try { - Ebean.delete(u0); - Assert.assertTrue("expecting an exception", false); - - } catch (PersistenceException e) { - // we expect this - Assert.assertTrue(true); - } - - u0.getValidRoles().clear(); - Ebean.save(u0); - + LoggedSqlCollector.start(); Ebean.delete(u0); + + final List sql = LoggedSqlCollector.stop(); + assertThat(sql).hasSize(2); + assertThat(sql.get(0)).contains("delete from mnoc_user_mnoc_role where mnoc_user_user_id = ?"); + assertThat(sql.get(1)).contains("delete from mnoc_user where user_id=? and version=?"); + + final MnocUser found = Ebean.find(MnocUser.class, u0.getUserId()); + assertThat(found).isNull(); } } diff --git a/src/test/java/org/tests/model/basic/MnocRole.java b/src/test/java/org/tests/model/basic/MnocRole.java index 44c0ba5be..9b7b6b083 100644 --- a/src/test/java/org/tests/model/basic/MnocRole.java +++ b/src/test/java/org/tests/model/basic/MnocRole.java @@ -15,8 +15,13 @@ public class MnocRole { @Version Integer version; - public MnocRole() { - + /** + * Only for testing. + */ + public MnocRole(MnocRole other) { + this.roleId = other.getRoleId(); + this.roleName = other.getRoleName(); + this.version = other.getVersion(); } public MnocRole(String roleName) { diff --git a/src/test/java/org/tests/model/basic/MnocUser.java b/src/test/java/org/tests/model/basic/MnocUser.java index 3093c2f2b..f34eb753d 100644 --- a/src/test/java/org/tests/model/basic/MnocUser.java +++ b/src/test/java/org/tests/model/basic/MnocUser.java @@ -21,14 +21,10 @@ public class MnocUser { Integer version; // No cascade REMOVE - @ManyToMany(cascade = CascadeType.PERSIST) + @ManyToMany @OrderBy("roleName") List validRoles; - public MnocUser() { - - } - public MnocUser(String userName) { this.userName = userName; }