From ab301f970ccbe0ba5019de25b58bc2a6ff0c8ff5 Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Sun, 20 May 2018 06:53:56 +0200 Subject: [PATCH] FIX: correct caching when collection with different inherited beans is put to the cache (#1379) * FIX: correct cahcing when collection with different inherited beans is put to the cache * removed some sysouts --- .../deploy/BeanDescriptorCacheHelp.java | 16 ++++++- .../cache/TestInheritanceRefCache.java | 47 +++++++++++++++++++ .../org/tests/model/basic/cache/CInhRoot.java | 2 +- 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java index 51d6b9fbf..1d11da087 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java @@ -447,7 +447,21 @@ final class BeanDescriptorCacheHelp { void beanPutAll(Collection beans) { if (desc.inheritInfo != null) { Class aClass = theClassOf(beans); - desc.descOf(aClass).cacheBeanPutAllDirect(beans); + // check if all beans have the same class + for (EntityBean bean : beans) { + if (!bean.getClass().equals(aClass)) { + aClass = null; + break; + } + } + if (aClass == null) { + // there are different bean types in the collection, so we add one by one to the cache + for (EntityBean bean : beans) { + desc.descOf(bean.getClass()).cacheBeanPutDirect(bean); + } + } else { + desc.descOf(aClass).cacheBeanPutAllDirect(beans); + } } else { beanCachePutAllDirect(beans); } diff --git a/src/test/java/org/tests/inheritance/cache/TestInheritanceRefCache.java b/src/test/java/org/tests/inheritance/cache/TestInheritanceRefCache.java index 1f45212eb..3314a5dde 100644 --- a/src/test/java/org/tests/inheritance/cache/TestInheritanceRefCache.java +++ b/src/test/java/org/tests/inheritance/cache/TestInheritanceRefCache.java @@ -4,10 +4,14 @@ import io.ebean.BaseTestCase; import io.ebean.Ebean; import org.tests.model.basic.cache.CInhOne; import org.tests.model.basic.cache.CInhRef; +import org.tests.model.basic.cache.CInhRoot; +import org.tests.model.basic.cache.CInhTwo; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.*; +import java.util.ArrayList; import java.util.List; import org.ebeantest.LoggedSqlCollector; @@ -61,4 +65,47 @@ public class TestInheritanceRefCache extends BaseTestCase { assertThat(sql).hasSize(0); } + + @Test + public void testMap() { + + List ids = new ArrayList<>(); + + CInhOne one = new CInhOne(); + one.setLicenseNumber("O19"); + one.setDriver("Foo"); + one.setNotes("Hello"); + Ebean.save(one); + + ids.add(one.getId()); + + CInhTwo two = new CInhTwo(); + two.setLicenseNumber("T23"); + two.setAction("Test"); + Ebean.save(two); + + ids.add(two.getId()); + + + LoggedSqlCollector.start(); + + Ebean.find(CInhRoot.class).setUseQueryCache(true).where().idIn(ids).setMapKey("licenseNumber").findMap(); + + List sql = LoggedSqlCollector.stop(); + assertThat(sql).hasSize(1); + assertThat(sql.get(0)).contains("from cinh_root"); + + // try some cache finds + Ebean.find(CInhRoot.class).setUseQueryCache(true).findList(); + Ebean.find(CInhRoot.class).setUseQueryCache(true).findList(); + Ebean.find(CInhRoot.class).setUseQueryCache(true).findList(); + + LoggedSqlCollector.start(); + + Ebean.find(CInhRoot.class).setUseQueryCache(true).where().idIn(ids).setMapKey("licenseNumber").findMap(); + + sql = LoggedSqlCollector.stop(); + assertThat(sql).hasSize(0); + } + } diff --git a/src/test/java/org/tests/model/basic/cache/CInhRoot.java b/src/test/java/org/tests/model/basic/cache/CInhRoot.java index 94b631159..548ee094c 100644 --- a/src/test/java/org/tests/model/basic/cache/CInhRoot.java +++ b/src/test/java/org/tests/model/basic/cache/CInhRoot.java @@ -7,7 +7,7 @@ import javax.persistence.DiscriminatorColumn; import javax.persistence.Entity; import javax.persistence.Inheritance; -@Cache +@Cache(enableQueryCache = true) @Entity @Inheritance @DiscriminatorColumn(length = 3)