From b329ae42dbef28291d32fbc8abfa2e3774b01aef Mon Sep 17 00:00:00 2001 From: Ryszard Trojnacki Date: Wed, 11 Sep 2019 05:30:32 +0200 Subject: [PATCH] Allow for null items in @DbArray lists. (#1812) * Added code to allow for null items in @DbArray lists. * Test case for changing OneToMany collection by editing target bean. --- .../server/type/ScalarTypeArrayList.java | 3 +- .../tests/cache/TestCacheCollectionIds.java | 48 ++++++++++++++--- .../tests/model/array/TestDbArray_basic.java | 53 +++++++++++++++++++ 3 files changed, 96 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java b/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java index 8a728c0ec..f3d6ea4c7 100644 --- a/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java +++ b/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java @@ -104,7 +104,8 @@ public class ScalarTypeArrayList extends ScalarTypeArrayBase implements Sc protected List fromArray(Object[] array1) { List list = new ArrayList(array1.length); for (Object element : array1) { - list.add(converter.toElement(element)); + if(element == null ) list.add(null); + else list.add(converter.toElement(element)); } return new ModifyAwareList(list); } diff --git a/src/test/java/org/tests/cache/TestCacheCollectionIds.java b/src/test/java/org/tests/cache/TestCacheCollectionIds.java index bb09dd70e..a57908242 100644 --- a/src/test/java/org/tests/cache/TestCacheCollectionIds.java +++ b/src/test/java/org/tests/cache/TestCacheCollectionIds.java @@ -12,13 +12,7 @@ import io.ebeaninternal.server.cache.CachedManyIds; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; -import org.tests.model.basic.Contact; -import org.tests.model.basic.Country; -import org.tests.model.basic.Customer; -import org.tests.model.basic.OCachedBean; -import org.tests.model.basic.Order; -import org.tests.model.basic.OrderDetail; -import org.tests.model.basic.ResetBasicData; +import org.tests.model.basic.*; import java.util.ArrayList; import java.util.List; @@ -146,6 +140,46 @@ public class TestCacheCollectionIds extends BaseTestCase { assertTrue(cachedManyIds.getIdList().contains("AU")); } + @Test + public void testChangingCollectionByEditingConnectedBean() { + ResetBasicData.reset(); + + OCachedBean cachedBean = new OCachedBean(); + cachedBean.setName("hello"); + + Ebean.save(cachedBean); + awaitL2Cache(); + + OCachedBean dummyToLoad = Ebean.find(OCachedBean.class, cachedBean.getId()); + assertEquals(0, dummyToLoad.getChildren().size()); + + OCachedBeanChild child1=new OCachedBeanChild(); + child1.setCachedBean(cachedBean); + Ebean.insert(child1); + awaitL2Cache(); + dummyToLoad = Ebean.find(OCachedBean.class, cachedBean.getId()); + assertEquals(1, dummyToLoad.getChildren().size()); + + OCachedBeanChild child2=new OCachedBeanChild(); + child2.setCachedBean(cachedBean); + Ebean.insert(child2); + awaitL2Cache(); + dummyToLoad = Ebean.find(OCachedBean.class, cachedBean.getId()); + assertEquals(2, dummyToLoad.getChildren().size()); + + Ebean.delete(child2); + awaitL2Cache(); + dummyToLoad = Ebean.find(OCachedBean.class, cachedBean.getId()); + assertEquals(1, dummyToLoad.getChildren().size()); + + Ebean.delete(child1); + awaitL2Cache(); + dummyToLoad = Ebean.find(OCachedBean.class, cachedBean.getId()); + assertEquals(0, dummyToLoad.getChildren().size()); + + Ebean.delete(cachedBean); + } + /** * When updating a ManyToMany relations also the collection cache must be updated. diff --git a/src/test/java/org/tests/model/array/TestDbArray_basic.java b/src/test/java/org/tests/model/array/TestDbArray_basic.java index f13bf3516..0566d6307 100644 --- a/src/test/java/org/tests/model/array/TestDbArray_basic.java +++ b/src/test/java/org/tests/model/array/TestDbArray_basic.java @@ -18,6 +18,7 @@ import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; public class TestDbArray_basic extends BaseTestCase { @@ -190,4 +191,56 @@ public class TestDbArray_basic extends BaseTestCase { Ebean.saveAll(all); Ebean.deleteAll(all); } + + @Test + public void nullItems() { + EArrayBean bean = new EArrayBean(); + bean.setName("null items"); + + List doubles = new ArrayList<>(); + doubles.add(1.3); + doubles.add(null); + doubles.add(2.4); + + bean.getPhoneNumbers().add("111222333"); + bean.getPhoneNumbers().add(null); + bean.getPhoneNumbers().add("333222111"); + + bean.getOtherIds().add(15L); + bean.getOtherIds().add(null); + bean.getOtherIds().add(30L); + bean.getOtherIds().add(null); + + bean.getUids().add(UUID.randomUUID()); + bean.getUids().add(null); + bean.getUids().add(UUID.randomUUID()); + + bean.setDoubs(doubles); + + bean.setStatuses(new ArrayList<>()); + bean.getStatuses().add(EArrayBean.Status.ONE); + bean.getStatuses().add(null); + bean.getStatuses().add(EArrayBean.Status.THREE); + + bean.getVcEnums().add(VarcharEnum.ONE); + bean.getVcEnums().add(null); + bean.getVcEnums().add(VarcharEnum.TWO); + + bean.getIntEnums().add(null); + bean.getIntEnums().add(IntEnum.ZERO); + bean.getIntEnums().add(null); + bean.getIntEnums().add(IntEnum.TWO); + + Ebean.save(bean); + + found = Ebean.find(EArrayBean.class, bean.getId()); + assertThat(found.getPhoneNumbers()).containsExactly("111222333", null, "333222111"); + assertThat(found.getOtherIds()).containsExactly(15L, null, 30L, null); + assertNull(found.getUids().get(1)); + assertThat(found.getDoubs()).containsExactly(1.3, null, 2.4); + assertThat(found.getStatuses()).containsExactly(EArrayBean.Status.ONE, null, EArrayBean.Status.THREE); + assertThat(found.getVcEnums()).containsExactly(VarcharEnum.ONE, null, VarcharEnum.TWO); + assertThat(found.getIntEnums()).containsExactly(null, IntEnum.ZERO, null, IntEnum.TWO); + Ebean.delete(bean); + } }