From 4b9d4d0a900828b8fde7a8b66ea17c831f1495e7 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Tue, 29 Aug 2023 21:13:19 +1200 Subject: [PATCH] Follow up #3173 - Add test for BeanSet clear() when hashCode/equals used This shows the extra lazy loading that is occurring when clear() is called on the [Bean]Set DUE to the hashcode/equals implementation that is present on the entity bean that is in the Set. --- .../test/java/org/tests/sets/O2MDepart.java | 2 +- .../test/java/org/tests/sets/TestO2MSet.java | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/ebean-test/src/test/java/org/tests/sets/O2MDepart.java b/ebean-test/src/test/java/org/tests/sets/O2MDepart.java index 5034bd8f8..a2272e4f9 100644 --- a/ebean-test/src/test/java/org/tests/sets/O2MDepart.java +++ b/ebean-test/src/test/java/org/tests/sets/O2MDepart.java @@ -13,7 +13,7 @@ public class O2MDepart { private final String name; - @OneToMany(cascade = CascadeType.PERSIST) + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) private final Set employees = new LinkedHashSet<>(); public O2MDepart(String name) { diff --git a/ebean-test/src/test/java/org/tests/sets/TestO2MSet.java b/ebean-test/src/test/java/org/tests/sets/TestO2MSet.java index 1a9a13194..59d0ccfa8 100644 --- a/ebean-test/src/test/java/org/tests/sets/TestO2MSet.java +++ b/ebean-test/src/test/java/org/tests/sets/TestO2MSet.java @@ -5,6 +5,7 @@ import io.ebean.test.LoggedSql; import org.junit.jupiter.api.Test; import java.util.List; +import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; @@ -27,4 +28,45 @@ class TestO2MSet { assertThat(sql.get(0)).contains("select t0.id, t0.name from o2_mdepart t0 where t0.id = ?"); assertThat(sql.get(1)).contains("select t0.department_id, t0.id, t0.code, t0.name, t0.department_id from o2_memp t0 where"); } + + @Test + void beanSet_when_clear_thenAddSave() { + + final O2MDepart department = new O2MDepart("clearAndAdd"); + final O2MEmp employee0 = new O2MEmp("Init1", "Code0"); + final O2MEmp employee1 = new O2MEmp("Init2", "Code1"); + department.addEmployee(employee0); + department.addEmployee(employee1); + DB.save(department); + + LoggedSql.start(); + + O2MDepart dept = DB.find(O2MDepart.class, department.getId()); + + List sql = LoggedSql.collect(); + assertThat(sql).hasSize(1); + assertThat(sql.get(0)).contains("select t0.id, t0.name from o2_mdepart t0 where t0.id = ?"); + + Set employees = dept.employees(); + employees.clear(); + + sql = LoggedSql.collect(); + assertThat(sql).hasSize(3); + assertThat(sql.get(0)).contains("select t0.department_id, t0.id from o2_memp t0 where (t0.department_id)"); + assertThat(sql.get(1)).contains("select t0.id, t0.code, t0.name, t0.department_id from o2_memp t0 where t0.id = ?"); + assertThat(sql.get(2)).contains("select t0.id, t0.code, t0.name, t0.department_id from o2_memp t0 where t0.id = ?"); + + final O2MEmp employee2 = new O2MEmp("After1", "Code3"); + employees.add(employee2); + + DB.save(dept); + + sql = LoggedSql.collect(); + assertThat(sql).hasSize(5); + assertThat(sql.get(0)).contains("delete from o2_memp where id=?"); + assertThat(sql.get(1)).contains(" -- bind"); + assertThat(sql.get(2)).contains(" -- bind"); + assertThat(sql.get(3)).contains("insert into o2_memp (id, code, name, department_id) values (?,?,?,?)"); + assertThat(sql.get(4)).contains(" -- bind"); + } }