diff --git a/ebean-test/src/test/java/org/tests/o2m/TestOneToManyStatelessUpdateResultsInSoftDelete.java b/ebean-test/src/test/java/org/tests/o2m/TestOneToManyStatelessUpdateResultsInSoftDelete.java index e6e86e5dd..d322ad3d3 100644 --- a/ebean-test/src/test/java/org/tests/o2m/TestOneToManyStatelessUpdateResultsInSoftDelete.java +++ b/ebean-test/src/test/java/org/tests/o2m/TestOneToManyStatelessUpdateResultsInSoftDelete.java @@ -5,12 +5,10 @@ import io.ebean.DB; import io.ebean.test.LoggedSql; import io.ebean.xtest.BaseTestCase; import org.junit.jupiter.api.Test; -import org.tests.o2m.dm.GoodsEntity; -import org.tests.o2m.dm.PersonEntity; -import org.tests.o2m.dm.WorkflowEntity; -import org.tests.o2m.dm.WorkflowOperationEntity; +import org.tests.o2m.dm.*; import java.io.StringWriter; +import java.sql.SQLException; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -235,4 +233,41 @@ class TestOneToManyStatelessUpdateResultsInSoftDelete extends BaseTestCase { assertThat(readGoods.getWorkflowEntity().getOperations()).hasSize(0); } } + + @Test + void setArrayListDoInsertInsteadUpdate() { + var attachment1 = new Attachment(); + attachment1.setName("File1"); + var attachment2 = new Attachment(); + attachment1.setName("File2"); + var goods = new GoodsEntity(); + goods.setName("goods1"); + goods.setAttachments(List.of(attachment1, attachment2)); + + DB.save(goods); + + var marshaledGoods = DB.json().toBean(GoodsEntity.class, DB.json().toJson(goods)); + var persistedGoods = DB.find(GoodsEntity.class, goods.getId()); + + // this forces insert and throws exception due primary key conflict + persistedGoods.setAttachments(marshaledGoods.getAttachments()); + try { + logger.info("Saving goods with set new attachments list"); + DB.save(persistedGoods); + } catch (Exception e) { + logger.error("Insert instead update", e); + } + + persistedGoods = DB.find(GoodsEntity.class, goods.getId()); + + // this works good + persistedGoods.getAttachments().clear(); + persistedGoods.getAttachments().addAll(marshaledGoods.getAttachments()); + try { + logger.info("Saving goods with clear/added attachments"); + DB.save(persistedGoods); + } catch (Exception e) { + logger.error("Insert instead update", e); + } + } } diff --git a/ebean-test/src/test/java/org/tests/o2m/dm/Attachment.java b/ebean-test/src/test/java/org/tests/o2m/dm/Attachment.java new file mode 100644 index 000000000..411695428 --- /dev/null +++ b/ebean-test/src/test/java/org/tests/o2m/dm/Attachment.java @@ -0,0 +1,16 @@ +package org.tests.o2m.dm; + +import javax.persistence.Entity; + +@Entity +public class Attachment extends HistoryColumns { + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/ebean-test/src/test/java/org/tests/o2m/dm/GoodsEntity.java b/ebean-test/src/test/java/org/tests/o2m/dm/GoodsEntity.java index ab29d5435..28482c805 100644 --- a/ebean-test/src/test/java/org/tests/o2m/dm/GoodsEntity.java +++ b/ebean-test/src/test/java/org/tests/o2m/dm/GoodsEntity.java @@ -1,8 +1,7 @@ package org.tests.o2m.dm; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.OneToOne; +import javax.persistence.*; +import java.util.List; @Entity public class GoodsEntity extends HistoryColumns { @@ -11,6 +10,9 @@ public class GoodsEntity extends HistoryColumns { @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) private WorkflowEntity workflowEntity; + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + private List attachments; + public String getName() { return name; } @@ -26,4 +28,12 @@ public class GoodsEntity extends HistoryColumns { public void setWorkflowEntity(WorkflowEntity workflowEntity) { this.workflowEntity = workflowEntity; } + + public List getAttachments() { + return attachments; + } + + public void setAttachments(List attachments) { + this.attachments = attachments; + } }