From d2ece76ca8a1d19fe358928eaeed6d9d7ad8e6d2 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Thu, 12 Sep 2019 14:55:37 +1200 Subject: [PATCH] #1816 Fix for OneToMany relation to non-cached target bean. --- .../java/io/ebeaninternal/api/LoadManyRequest.java | 2 +- .../io/ebeaninternal/server/cache/CacheChangeSet.java | 2 +- .../ebeaninternal/server/core/DefaultBeanLoader.java | 2 +- .../server/deploy/BeanPropertyAssocMany.java | 10 +++++++++- .../server/loadcontext/DLoadManyContext.java | 2 +- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/ebeaninternal/api/LoadManyRequest.java b/src/main/java/io/ebeaninternal/api/LoadManyRequest.java index 0e234536f..043f51e58 100644 --- a/src/main/java/io/ebeaninternal/api/LoadManyRequest.java +++ b/src/main/java/io/ebeaninternal/api/LoadManyRequest.java @@ -169,7 +169,7 @@ public class LoadManyRequest extends LoadRequest { Object parentId = desc.getId(ownerBean); logger.debug("BeanCollection after lazy load was empty. type:" + ownerBean.getClass().getName() + " id:" + parentId + " owner:" + ownerBean); } - } else if (isLoadCache()) { + } else if (isLoadCache() && many.isUseCache()) { Object parentId = desc.getId(bc.getOwnerBean()); desc.cacheManyPropPut(many, bc, parentId); } diff --git a/src/main/java/io/ebeaninternal/server/cache/CacheChangeSet.java b/src/main/java/io/ebeaninternal/server/cache/CacheChangeSet.java index b25ba9ce5..20cd7329c 100644 --- a/src/main/java/io/ebeaninternal/server/cache/CacheChangeSet.java +++ b/src/main/java/io/ebeaninternal/server/cache/CacheChangeSet.java @@ -177,7 +177,7 @@ public class CacheChangeSet { final ManyKey key; - final List removes = new ArrayList<>(); + final Set removes = new HashSet<>(); final Map puts = new LinkedHashMap<>(); diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultBeanLoader.java b/src/main/java/io/ebeaninternal/server/core/DefaultBeanLoader.java index fc8d42027..faef445a6 100644 --- a/src/main/java/io/ebeaninternal/server/core/DefaultBeanLoader.java +++ b/src/main/java/io/ebeaninternal/server/core/DefaultBeanLoader.java @@ -82,7 +82,7 @@ class DefaultBeanLoader { parentDesc.contextPut(pc, parentId, parentBean); } - boolean useManyIdCache = beanCollection != null && parentDesc.isManyPropCaching(); + boolean useManyIdCache = beanCollection != null && parentDesc.isManyPropCaching() && many.isUseCache(); if (useManyIdCache) { Boolean readOnly = null; if (ebi.isReadOnly()) { diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index 969777472..f884bb900 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -226,6 +226,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST desc.registerTable(targetDescriptor.getBaseTable(), this); } } + /** * Return the underlying collection of beans. */ @@ -345,7 +346,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST /** * Add the loaded current bean to its associated parent. - * + *

* Helper method used by Elastic integration when loading with a persistence context. */ @Override @@ -967,6 +968,13 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST elementDescriptor.jsonWriteElement(ctx, element); } + /** + * Only cache Many Ids if the target bean is also cached. + */ + public boolean isUseCache() { + return targetDescriptor.isBeanCaching(); + } + /** * A Many (element collection) property in bean cache to held as JSON. */ diff --git a/src/main/java/io/ebeaninternal/server/loadcontext/DLoadManyContext.java b/src/main/java/io/ebeaninternal/server/loadcontext/DLoadManyContext.java index a1cdb0fb6..d58bcdcf0 100644 --- a/src/main/java/io/ebeaninternal/server/loadcontext/DLoadManyContext.java +++ b/src/main/java/io/ebeaninternal/server/loadcontext/DLoadManyContext.java @@ -209,7 +209,7 @@ class DLoadManyContext extends DLoadBaseContext implements LoadManyContext { public void loadMany(BeanCollection bc, boolean onlyIds) { synchronized (this) { - boolean useCache = context.hitCache && !onlyIds; + boolean useCache = !onlyIds && context.hitCache && context.property.isUseCache(); if (useCache) { EntityBean ownerBean = bc.getOwnerBean(); BeanDescriptor parentDesc = context.desc.getBeanDescriptor(ownerBean.getClass());