From 1098b572fe0a567092505bb87fc6111a88c9623b Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Mon, 7 Oct 2019 15:48:31 +1300 Subject: [PATCH] #1832 - Cascade insert @ElementCollection when marshalled from JSON --- .../persist/SaveManyElementCollection.java | 28 ++++++------- .../persist/SaveManyElementCollectionMap.java | 34 ++++++++------- .../elementcollection/EcmPersonTest.java | 41 +++++++++++++++++++ .../elementcollection/EcsPersonTest.java | 40 ++++++++++++++++++ 4 files changed, 110 insertions(+), 33 deletions(-) create mode 100644 src/test/java/org/tests/model/elementcollection/EcmPersonTest.java create mode 100644 src/test/java/org/tests/model/elementcollection/EcsPersonTest.java diff --git a/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollection.java b/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollection.java index 18f070556..63215c145 100644 --- a/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollection.java +++ b/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollection.java @@ -21,22 +21,20 @@ class SaveManyElementCollection extends SaveManyBase { void save() { Collection collection = BeanCollectionUtil.getActualEntries(value); - if (collection == null || !BeanCollectionUtil.isModified(value)) { - return; - } + if (collection != null && (insertedParent || BeanCollectionUtil.isModified(value))) { + Object parentId = request.getBeanId(); + preElementCollectionUpdate(parentId); - Object parentId = request.getBeanId(); - preElementCollectionUpdate(parentId); - - transaction.depth(+1); - SqlUpdate sqlInsert = server.createSqlUpdate(many.insertElementCollection()); - for (Object value : collection) { - sqlInsert.setNextParameter(parentId); - many.bindElementValue(sqlInsert, value); - server.execute(sqlInsert, transaction); + transaction.depth(+1); + SqlUpdate sqlInsert = server.createSqlUpdate(many.insertElementCollection()); + for (Object value : collection) { + sqlInsert.setNextParameter(parentId); + many.bindElementValue(sqlInsert, value); + server.execute(sqlInsert, transaction); + } + transaction.depth(-1); + resetModifyState(); + postElementCollectionUpdate(); } - transaction.depth(-1); - resetModifyState(); - postElementCollectionUpdate(); } } diff --git a/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollectionMap.java b/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollectionMap.java index 6da9b5c2c..41511262d 100644 --- a/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollectionMap.java +++ b/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollectionMap.java @@ -23,24 +23,22 @@ class SaveManyElementCollectionMap extends SaveManyBase { void save() { Set> entries = (Set>) BeanCollectionUtil.getActualEntries(value); - if (entries == null || !BeanCollectionUtil.isModified(value)) { - return; + if (entries != null && (insertedParent || BeanCollectionUtil.isModified(value))) { + Object parentId = request.getBeanId(); + preElementCollectionUpdate(parentId); + + transaction.depth(+1); + SqlUpdate sqlInsert = server.createSqlUpdate(many.insertElementCollection()); + for (Map.Entry entry : entries) { + sqlInsert.setNextParameter(parentId); + sqlInsert.setNextParameter(entry.getKey()); + many.bindElementValue(sqlInsert, entry.getValue()); + server.execute(sqlInsert, transaction); + } + + transaction.depth(-1); + resetModifyState(); + postElementCollectionUpdate(); } - - Object parentId = request.getBeanId(); - preElementCollectionUpdate(parentId); - - transaction.depth(+1); - SqlUpdate sqlInsert = server.createSqlUpdate(many.insertElementCollection()); - for (Map.Entry entry : entries) { - sqlInsert.setNextParameter(parentId); - sqlInsert.setNextParameter(entry.getKey()); - many.bindElementValue(sqlInsert, entry.getValue()); - server.execute(sqlInsert, transaction); - } - - transaction.depth(-1); - resetModifyState(); - postElementCollectionUpdate(); } } diff --git a/src/test/java/org/tests/model/elementcollection/EcmPersonTest.java b/src/test/java/org/tests/model/elementcollection/EcmPersonTest.java new file mode 100644 index 000000000..9b4b7b523 --- /dev/null +++ b/src/test/java/org/tests/model/elementcollection/EcmPersonTest.java @@ -0,0 +1,41 @@ +package org.tests.model.elementcollection; + + +import io.ebean.DB; +import io.ebean.text.json.JsonContext; +import org.ebeantest.LoggedSqlCollector; +import org.junit.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class EcmPersonTest { + + @Test + public void readJsonThenInsert() { + + EcmPerson source = new EcmPerson("Ethan027"); + source.getPhoneNumbers().put("home", "027 1234"); + source.getPhoneNumbers().put("work", "027 4321"); + + final JsonContext json = DB.json(); + final String asJson = json.toJson(source); + + final EcmPerson person = json.toBean(EcmPerson.class, asJson); + + LoggedSqlCollector.start(); + + DB.save(person); + + final List sql = LoggedSqlCollector.stop(); + + assertThat(sql).hasSize(4); + assertThat(sql.get(0)).contains("insert into ecm_person "); + assertThat(sql.get(1)).contains("insert into ecm_person_phone_numbers "); + assertThat(sql.get(2)).contains("-- bind"); + assertThat(sql.get(3)).contains("-- bind"); + + DB.delete(person); + } +} diff --git a/src/test/java/org/tests/model/elementcollection/EcsPersonTest.java b/src/test/java/org/tests/model/elementcollection/EcsPersonTest.java new file mode 100644 index 000000000..b6f60812e --- /dev/null +++ b/src/test/java/org/tests/model/elementcollection/EcsPersonTest.java @@ -0,0 +1,40 @@ +package org.tests.model.elementcollection; + +import io.ebean.DB; +import io.ebean.text.json.JsonContext; +import org.ebeantest.LoggedSqlCollector; +import org.junit.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class EcsPersonTest { + + @Test + public void jsonReadThenInsert() { + + EcsPerson source = new EcsPerson("Ethan027"); + source.getPhoneNumbers().add("027 1234"); + source.getPhoneNumbers().add("027 4321"); + + final JsonContext json = DB.json(); + final String asJson = json.toJson(source); + + final EcsPerson person = json.toBean(EcsPerson.class, asJson); + + LoggedSqlCollector.start(); + + DB.save(person); + + final List sql = LoggedSqlCollector.stop(); + + assertThat(sql).hasSize(4); + assertThat(sql.get(0)).contains("insert into ecs_person "); + assertThat(sql.get(1)).contains("insert into ecs_person_phone "); + assertThat(sql.get(2)).contains("-- bind"); + assertThat(sql.get(3)).contains("-- bind"); + + DB.delete(person); + } +}