From 89f7d2baceff50296c201c2be469372e9a1f2893 Mon Sep 17 00:00:00 2001 From: Wolfgang Buchner Date: Thu, 9 May 2013 16:23:15 +0200 Subject: [PATCH] Test and fix for TestStatelessUpdate.testStatelessRecursiveUpdateWithVersionField() --- .../server/persist/DefaultPersister.java | 12 +++--- .../tests/update/TestStatelessUpdate.java | 39 +++++++++++++++++++ 2 files changed, 45 insertions(+), 6 deletions(-) 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 78edd7678..7c4a86f33 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java @@ -765,15 +765,15 @@ public final class DefaultPersister implements Persister { if (prop.isManyToMany()) { skipSavingThisBean = targetDescriptor.isReference(ebi); } else { - if (ebi.isNewOrDirty()) { - skipSavingThisBean = false; - // set the parent bean to detailBean - prop.setJoinValuesToChild(parentBean, detail, mapKeyValue); - - } else if (targetDescriptor.isReference(ebi)) { + if (targetDescriptor.isReference(ebi)) { // we can skip this one skipSavingThisBean = true; + } else if (ebi.isNewOrDirty()) { + skipSavingThisBean = false; + // set the parent bean to detailBean + prop.setJoinValuesToChild(parentBean, detail, mapKeyValue); + } else { // unmodified so skip depending on prop.isSaveRecurseSkippable(); skipSavingThisBean = saveSkippable; diff --git a/src/test/java/com/avaje/tests/update/TestStatelessUpdate.java b/src/test/java/com/avaje/tests/update/TestStatelessUpdate.java index 12376dcd7..3cabfa29b 100644 --- a/src/test/java/com/avaje/tests/update/TestStatelessUpdate.java +++ b/src/test/java/com/avaje/tests/update/TestStatelessUpdate.java @@ -212,4 +212,43 @@ public class TestStatelessUpdate extends BaseTestCase { return server.getBeanState(cust).getLoadedProps().contains("contacts"); } + /** + * when using stateless updates with recursive calls, + * the version column shouldn't decide to use insert instead of update, + * although an ID has been set. + */ + @Test + public void testStatelessRecursiveUpdateWithVersionField() { + // arrange + Contact contact1 = new Contact(); + contact1.setLastName("contact1"); + + Contact contact2 = new Contact(); + contact2.setLastName("contact2"); + + Customer customer = new Customer(); + customer.setName("something"); + customer.getContacts().add(contact1); + customer.getContacts().add(contact2); + + server.save(customer); + + // act + Contact updateContact1 = new Contact(); + updateContact1.setId(contact1.getId()); + + Contact updateContact2 = new Contact(); + updateContact2.setId(contact2.getId()); + + Customer updateCustomer = new Customer(); + updateCustomer.setId(customer.getId()); + updateCustomer.getContacts().add(updateContact1); + updateCustomer.getContacts().add(updateContact2); + + server.update(updateCustomer); + + // assert + // maybe check if update instead of insert has been executed, + // currently "Unique index or primary key violation" PersistenceException is throwing + } }