diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java index 310a9bb20..4706ae5c8 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java @@ -278,7 +278,9 @@ final class BeanDescriptorCacheHelp { void manyPropPut(BeanPropertyAssocMany many, Object details, Object parentId) { CachedManyIds entry = createManyIds(many, details); - cachePutManyIds(parentId, many.getName(), entry); + if (entry != null) { + cachePutManyIds(parentId, many.getName(), entry); + } } void cachePutManyIds(Object parentId, String manyName, CachedManyIds entry) { @@ -296,6 +298,9 @@ final class BeanDescriptorCacheHelp { List idList = new ArrayList(); Collection actualDetails = BeanCollectionUtil.getActualEntries(details); + if (actualDetails == null) { + return null; + } for (Object bean : actualDetails) { idList.add(targetDescriptor.getId((EntityBean) bean)); } @@ -621,7 +626,9 @@ final class BeanDescriptorCacheHelp { BeanPropertyAssocMany many = manyCollections.get(i); Object details = many.getValue(updateRequest.getEntityBean()); CachedManyIds entry = createManyIds(many, details); - changeSet.addManyPut(desc, many.getName(), id, entry); + if (entry != null) { + changeSet.addManyPut(desc, many.getName(), id, entry); + } } } diff --git a/src/test/java/com/avaje/tests/cache/TestCacheCollectionIds.java b/src/test/java/com/avaje/tests/cache/TestCacheCollectionIds.java index d0283d001..6836cdfb4 100644 --- a/src/test/java/com/avaje/tests/cache/TestCacheCollectionIds.java +++ b/src/test/java/com/avaje/tests/cache/TestCacheCollectionIds.java @@ -1,5 +1,6 @@ package com.avaje.tests.cache; +import java.util.ArrayList; import java.util.List; import org.junit.Assert; @@ -240,4 +241,37 @@ public class TestCacheCollectionIds extends BaseTestCase { Assert.assertEquals(1, result.getCountries().size()); } + + @Test + public void testUpdating_noChange() throws InterruptedException { + + ResetBasicData.reset(); + + Ebean.beginTransaction(); + try { + + OCachedBean cachedBean = new OCachedBean(); + cachedBean.setName("helloForUpdate"); + Ebean.save(cachedBean); + + cachedBean = Ebean.find(OCachedBean.class, cachedBean.getId()); + + cachedBean.setName("mod"); + ArrayList list = new ArrayList(); + list.add(Ebean.find(Country.class, "NZ")); + cachedBean.setCountries(list); + Ebean.save(cachedBean); + + + cachedBean.setName("mod2"); + Ebean.save(cachedBean); + + Ebean.commitTransaction(); + } finally { + Ebean.endTransaction(); + } + + + Thread.sleep(2000); + } } diff --git a/src/test/java/com/avaje/tests/model/basic/OCachedBean.java b/src/test/java/com/avaje/tests/model/basic/OCachedBean.java index da6438416..cc7be91b2 100644 --- a/src/test/java/com/avaje/tests/model/basic/OCachedBean.java +++ b/src/test/java/com/avaje/tests/model/basic/OCachedBean.java @@ -24,7 +24,7 @@ public class OCachedBean { String name; - @ManyToMany + @ManyToMany(cascade = CascadeType.ALL) List countries = new ArrayList(); @OneToMany(mappedBy = "cachedBean", cascade = CascadeType.ALL)