diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index d4f3c3488..c3d95dafc 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -24,6 +24,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; /** * Property mapped to a List Set or Map. @@ -180,9 +181,27 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc { help.add(bc, detailBean); } - public boolean isEmptyBeanCollection(EntityBean bean) { + /** + * Return true if this is considered 'empty' from a save perspective. + */ + public boolean isEmptyBeanCollection(EntityBean bean, boolean insertedParent) { Object val = getValue(bean); - return val == null || (val instanceof BeanCollection) && ((BeanCollection) val).isEmptyAndUntouched(); + if (val == null) { + return true; + } + if ((val instanceof BeanCollection)) { + return ((BeanCollection) val).isEmptyAndUntouched(); + } + if (insertedParent) { + // check 'vanilla' collection types + if (val instanceof Collection){ + return ((Collection) val).isEmpty(); + } + if (val instanceof Map) { + return ((Map) val).isEmpty(); + } + } + return false; } /** diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java b/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java index dfc3ec8ce..3a38a543a 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java @@ -573,7 +573,7 @@ public final class DefaultPersister implements Persister { BeanPropertyAssocMany[] manys = desc.propertiesManySave(); for (int i = 0; i < manys.length; i++) { // check that property is loaded and not empty uninitialised collection - if (request.isLoadedProperty(manys[i]) && !manys[i].isEmptyBeanCollection(parentBean)) { + if (request.isLoadedProperty(manys[i]) && !manys[i].isEmptyBeanCollection(parentBean, insertedParent)) { saveMany(new SaveManyPropRequest(insertedParent, manys[i], parentBean, request), insertMode); if (!insertedParent) { request.addUpdatedManyProperty(manys[i]); diff --git a/src/test/java/com/avaje/tests/batchinsert/TestBatchInsertWithInitialisedCollection.java b/src/test/java/com/avaje/tests/batchinsert/TestBatchInsertWithInitialisedCollection.java new file mode 100644 index 000000000..e990a959b --- /dev/null +++ b/src/test/java/com/avaje/tests/batchinsert/TestBatchInsertWithInitialisedCollection.java @@ -0,0 +1,50 @@ +package com.avaje.tests.batchinsert; + +import com.avaje.ebean.BaseTestCase; +import com.avaje.ebean.Ebean; +import com.avaje.ebean.Transaction; +import com.avaje.ebean.config.PersistBatch; +import com.avaje.tests.model.basic.OCachedBean; +import org.avaje.ebeantest.LoggedSqlCollector; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestBatchInsertWithInitialisedCollection extends BaseTestCase { + + @Test + public void test() { + + List list = new ArrayList(); + + for (int i = 0; i < 3; i++) { + OCachedBean bean = new OCachedBean(); + bean.setName("name "+i); + list.add(bean); + } + + LoggedSqlCollector.start(); + + Transaction txn = Ebean.beginTransaction(); + try { + txn.setBatch(PersistBatch.ALL); + + Ebean.saveAll(list); + txn.commit(); + + } finally { + txn.end(); + } + + List loggedSql = LoggedSqlCollector.stop(); + assertThat(loggedSql).hasSize(3); + + for (String sql : loggedSql) { + assertThat(sql).contains("insert into o_cached_bean (id, name) values (?,?);"); + } + + } +}