diff --git a/src/main/java/com/erudika/para/server/persistence/MongoDBDAO.java b/src/main/java/com/erudika/para/server/persistence/MongoDBDAO.java index 54be20c..1d88bbd 100644 --- a/src/main/java/com/erudika/para/server/persistence/MongoDBDAO.java +++ b/src/main/java/com/erudika/para/server/persistence/MongoDBDAO.java @@ -43,6 +43,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -206,7 +207,7 @@ public

void createAll(String appid, List

objects) { } try { List documents = new ArrayList(); - for (ParaObject so : objects) { + for (ParaObject so : new LinkedHashSet<>(objects)) { // fix duplicate _id errors by using a set if (so != null) { if (StringUtils.isBlank(so.getId())) { so.setId(MongoDBUtils.generateNewId()); diff --git a/src/test/java/com/erudika/para/server/persistence/MongoDBDAOIT.java b/src/test/java/com/erudika/para/server/persistence/MongoDBDAOIT.java index 76e3d46..b1ebfde 100644 --- a/src/test/java/com/erudika/para/server/persistence/MongoDBDAOIT.java +++ b/src/test/java/com/erudika/para/server/persistence/MongoDBDAOIT.java @@ -17,12 +17,12 @@ */ package com.erudika.para.server.persistence; -import com.erudika.para.server.persistence.MongoDBDAO; -import com.erudika.para.server.persistence.MongoDBUtils; import com.erudika.para.core.Sysprop; +import java.util.List; import org.junit.AfterClass; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import org.junit.BeforeClass; @@ -130,4 +130,34 @@ public void testFieldNameSanitization() { d.delete(s1); } + @Test + public void testInsertManyWithIdDuplication() { + MongoDBDAO d = ((MongoDBDAO) dao()); + Sysprop s1 = new Sysprop("id:one"); + Sysprop s2 = new Sysprop("id:two"); + Sysprop s3 = new Sysprop("id:two"); + Sysprop s4 = new Sysprop("id:three"); + + d.createAll(List.of(s1, s2, s3, s4)); + + assertNotNull(d.read(s1.getId())); + assertNotNull(d.read(s2.getId())); + assertNotNull(d.read(s3.getId())); + assertNotNull(d.read(s4.getId())); + + s1.setName("updated"); + s2.setName("updated"); + s3.setName("updated"); + s4.setName("updated"); + + d.updateAll(List.of(s1, s2, s3, s4)); + + assertEquals("updated", d.read(s1.getId()).getName()); + assertEquals("updated", d.read(s2.getId()).getName()); + assertEquals("updated", d.read(s3.getId()).getName()); + assertEquals("updated", d.read(s4.getId()).getName()); + + d.deleteAll(List.of(s1, s2, s3, s4)); + } + }