From ade36582a0f17d200ed0b0f178e55c9906017739 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Tue, 19 Jan 2021 22:37:15 +1300 Subject: [PATCH] #2144 - Fix for NPE via Wrong beans in PersistContext avoid proper lazy load --- .../ebeaninternal/server/core/DefaultBeanLoader.java | 2 -- .../ebeaninternal/server/deploy/BeanDescriptor.java | 11 +++++++++++ .../server/deploy/BeanDescriptorCacheHelp.java | 3 +-- .../server/transaction/DefaultPersistenceContext.java | 4 ---- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultBeanLoader.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultBeanLoader.java index 8140a0082..34417ed14 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultBeanLoader.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultBeanLoader.java @@ -215,7 +215,6 @@ class DefaultBeanLoader { desc.contextPut(pc, id, bean); ebi.setPersistenceContext(pc); } - // desc.contextPut(pc, id, bean); // this will fix one of the two tests boolean draft = desc.isDraftInstance(bean); if (embeddedOwnerIndex == -1) { @@ -245,7 +244,6 @@ class DefaultBeanLoader { // and put the data into the original bean query.setUsageProfiling(false); query.setPersistenceContext(pc); - query.setMode(mode); query.setId(id); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index bc2c87e66..c2c69b164 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -1872,6 +1872,17 @@ public class BeanDescriptor implements BeanType, STreeType { return query.setId(id).findOne(); } + /** + * Create a reference with a check for the bean in the persistence context. + */ + public EntityBean createReference(Boolean readOnly, Object id, PersistenceContext pc) { + Object refBean = contextGet(pc, id); + if (refBean == null) { + refBean = createReference(readOnly, false, id, pc); + } + return (EntityBean)refBean; + } + /** * Create a reference bean based on the id. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java index 9f420de9e..70377a540 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java @@ -313,8 +313,7 @@ final class BeanDescriptorCacheHelp { List idList = entry.getIdList(); bc.checkEmptyLazyLoad(); for (Object id : idList) { - Object refBean = targetDescriptor.createReference(readOnly, false, id, persistenceContext); - many.add(bc, (EntityBean) refBean); + many.add(bc, targetDescriptor.createReference(readOnly, id, persistenceContext)); } return true; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultPersistenceContext.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultPersistenceContext.java index cf239b8c4..df92246fa 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultPersistenceContext.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultPersistenceContext.java @@ -296,10 +296,6 @@ public final class DefaultPersistenceContext implements PersistenceContext { } private void put(Object id, Object b) { - Object existing = map.get(id); - if (existing != null && existing != b) { - System.out.println("DEBUG: Overwriting object"); - } // else // will fix both tests map.put(id, b); }