From 7e4bde8d3437286dec4328ac5303883e61eeff00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20P=C3=B6hler?= Date: Thu, 19 Aug 2021 17:11:31 +0200 Subject: [PATCH] FIX: Modification of a OneToMany-Relation with @OrderColumn was not detected --- .../server/deploy/BeanPropertyAssocMany.java | 6 ++-- .../org/tests/cascade/TestOrderedList.java | 33 ++++++++++++++----- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index c823e9a7e..de13412d9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -471,7 +471,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST } } - + if (softDelete) { String alias = hasJoinTable() ? "x2" : "x"; sb.append(" and ").append(targetDescriptor.getSoftDeletePredicate(alias)); @@ -606,7 +606,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST if (!manyToMany && childMasterProperty != null) { // bidirectional in the sense that the 'master' property // exists on the 'detail' bean - childMasterProperty.setValue(child, parent); + childMasterProperty.setValueIntercept(child, parent); } } @@ -1072,7 +1072,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST public void bindElementValue(SqlUpdate insert, Object value) { targetDescriptor.bindElementValue(insert, value); } - + /** * Returns true, if we must create a m2m join table. */ diff --git a/ebean-core/src/test/java/org/tests/cascade/TestOrderedList.java b/ebean-core/src/test/java/org/tests/cascade/TestOrderedList.java index 5ccc781f9..0045a502b 100644 --- a/ebean-core/src/test/java/org/tests/cascade/TestOrderedList.java +++ b/ebean-core/src/test/java/org/tests/cascade/TestOrderedList.java @@ -1,7 +1,7 @@ package org.tests.cascade; import io.ebean.BaseTestCase; -import io.ebean.Ebean; +import io.ebean.DB; import org.ebeantest.LoggedSqlCollector; import org.junit.Test; @@ -22,7 +22,7 @@ public class TestOrderedList extends BaseTestCase { } LoggedSqlCollector.start(); - Ebean.save(master); + DB.save(master); List sql = LoggedSqlCollector.current(); assertThat(sql.size()).isGreaterThan(1); @@ -35,7 +35,7 @@ public class TestOrderedList extends BaseTestCase { } // update without any changes - Ebean.save(master); + DB.save(master); sql = LoggedSqlCollector.current(); assertThat(sql).isEmpty(); @@ -43,7 +43,7 @@ public class TestOrderedList extends BaseTestCase { // update just changing master master.setName("m1-mod"); - Ebean.save(master); + DB.save(master); sql = LoggedSqlCollector.current(); assertThat(sql).hasSize(1); assertSql(sql.get(0)).contains("update om_ordered_master set name=?, version=?"); @@ -53,14 +53,14 @@ public class TestOrderedList extends BaseTestCase { private void fetchAndReorder(Long id) { - OmOrderedMaster fresh = Ebean.find(OmOrderedMaster.class).setId(id).fetch("details").findOne(); + OmOrderedMaster fresh = DB.find(OmOrderedMaster.class).setId(id).fetch("details").findOne(); List details1 = fresh.getDetails(); List sql = LoggedSqlCollector.current(); assertSql(sql.get(0)).contains("order by t0.id, t1.sort_order"); // fetched, not dirty - Ebean.save(fresh); + DB.save(fresh); sql = LoggedSqlCollector.current(); assertThat(sql).isEmpty(); @@ -73,7 +73,7 @@ public class TestOrderedList extends BaseTestCase { fresh.setName("m1-reorder"); - Ebean.save(fresh); + DB.save(fresh); sql = LoggedSqlCollector.current(); assertThat(sql).hasSize(7); @@ -82,7 +82,7 @@ public class TestOrderedList extends BaseTestCase { details1.get(1).setName("was 1"); fresh.setName("m1-mod3"); - Ebean.save(fresh); + DB.save(fresh); sql = LoggedSqlCollector.current(); assertThat(sql).hasSize(3); @@ -90,7 +90,7 @@ public class TestOrderedList extends BaseTestCase { assertSql(sql.get(1)).contains("update om_ordered_detail set name=?, version=?, sort_order=? where id=? and version=?"); assertThat(sql.get(2)).contains("bind(was 1,3,2,"); - Ebean.delete(fresh); + DB.delete(fresh); sql = LoggedSqlCollector.stop(); assertThat(sql).hasSize(3); @@ -98,4 +98,19 @@ public class TestOrderedList extends BaseTestCase { assertSqlBind(sql.get(1)); assertSql(sql.get(2)).contains("delete from om_ordered_master where id=? and version=?"); } + + @Test + public void testAddSavedDetailToMaster() { + final OmOrderedMaster master = new OmOrderedMaster("Master"); + final OmOrderedDetail detail = new OmOrderedDetail("Detail"); + + DB.save(master); + DB.save(detail); + + master.getDetails().add(detail); + DB.save(master); + + final OmOrderedMaster masterDb = DB.find(OmOrderedMaster.class, master.getId()); + assertThat(masterDb.getDetails()).hasSize(1); + } }