diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java index b6e5d8a96..c21b00413 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java @@ -345,6 +345,10 @@ final class SaveManyBeans extends SaveManyBase { if (insertedParent) { // after insert set the modify listening mode for private owned etc c.setModifyListening(many.modifyListenMode()); + } else { + // a lazily initialized collection (e.g. first save had null value) has no + // listen mode yet - set it now so that subsequent modifications are tracked + setListenMode(c, many); } // We must not reset when we still have to update other entities in the collection and set their new orderColumn value if (!hasOrderColumn) { diff --git a/ebean-test/src/test/java/org/tests/cascade/TestOrderedList.java b/ebean-test/src/test/java/org/tests/cascade/TestOrderedList.java index cdbb39b38..b7d9a3531 100644 --- a/ebean-test/src/test/java/org/tests/cascade/TestOrderedList.java +++ b/ebean-test/src/test/java/org/tests/cascade/TestOrderedList.java @@ -1,9 +1,12 @@ package org.tests.cascade; +import io.ebean.bean.BeanCollection; import io.ebean.xtest.BaseTestCase; import io.ebean.DB; import io.ebean.test.LoggedSql; import org.junit.jupiter.api.Test; +import org.tests.model.basic.Section; +import org.tests.model.basic.SubSection; import java.util.Collections; import java.util.List; @@ -149,6 +152,44 @@ public class TestOrderedList extends BaseTestCase { } + @Test + public void testModifyListenModeSet1() { + final OmOrderedMaster master = new OmOrderedMaster("Master"); + final OmOrderedDetail detail1 = new OmOrderedDetail("Detail1"); + DB.save(detail1); + DB.save(master); + + master.getDetails().add(detail1); + + DB.save(master); + + master.getDetails().clear(); + + DB.save(master); + + OmOrderedMaster masterDb = DB.find(OmOrderedMaster.class, master.getId()); + assertThat(masterDb.getDetails()).isEmpty(); + } + + @Test + public void testModifyListenModeSet2() { + final Section master = new Section(); + final SubSection detail1 = new SubSection(); + DB.save(detail1); + DB.save(master); + + master.getSubSections().add(detail1); + + DB.save(master); + + master.getSubSections().clear(); + + DB.save(master); + + Section masterDb = DB.find(Section.class, master.getId()); + assertThat(masterDb.getSubSections()).isEmpty(); + } + @Test public void testModifyListWithCache() { final OmCacheOrderedMaster master = new OmCacheOrderedMaster("Master");