diff --git a/src/main/java/com/avaje/ebean/bean/EntityBeanIntercept.java b/src/main/java/com/avaje/ebean/bean/EntityBeanIntercept.java
index 8b28cf679..70001b123 100644
--- a/src/main/java/com/avaje/ebean/bean/EntityBeanIntercept.java
+++ b/src/main/java/com/avaje/ebean/bean/EntityBeanIntercept.java
@@ -39,8 +39,6 @@ public final class EntityBeanIntercept implements Serializable {
private transient PersistenceContext persistenceContext;
private transient BeanLoader beanLoader;
-
- private int beanLoaderIndex;
private String ebeanServerName;
@@ -200,34 +198,22 @@ public final class EntityBeanIntercept implements Serializable {
}
/**
- * Return the index position for batch loading via BeanLoader.
+ * Set the BeanLoader with PersistenceContext.
*/
- public int getBeanLoaderIndex() {
- return beanLoaderIndex;
- }
-
- /**
- * Set Lazy Loading by ebeanServerName.
- *
- * This is for reference beans created by themselves.
- *
- */
- public void setBeanLoaderByServerName(String ebeanServerName) {
- this.beanLoaderIndex = 0;
- this.beanLoader = null;
- this.ebeanServerName = ebeanServerName;
- }
-
- /**
- * Set the BeanLoader for general lazy loading.
- */
- public void setBeanLoader(int index, BeanLoader beanLoader, PersistenceContext ctx) {
- this.beanLoaderIndex = index;
+ public void setBeanLoader(BeanLoader beanLoader, PersistenceContext ctx) {
this.beanLoader = beanLoader;
this.persistenceContext = ctx;
this.ebeanServerName = beanLoader.getName();
}
-
+
+ /**
+ * Set the BeanLoader.
+ */
+ public void setBeanLoader(BeanLoader beanLoader) {
+ this.beanLoader = beanLoader;
+ this.ebeanServerName = beanLoader.getName();
+ }
+
public boolean isFullyLoadedBean() {
return fullyLoadedBean;
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java
index 02f47d74f..90152549f 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java
@@ -1210,8 +1210,7 @@ public class BeanDescriptor implements MetaBeanInfo {
convertSetId(id, eb);
EntityBeanIntercept ebi = eb._ebean_getIntercept();
- ebi.setBeanLoaderByServerName(ebeanServer.getName());
-
+ ebi.setBeanLoader(ebeanServer);
// Note: not creating proxies for many's...
ebi.setReference(idPropertyIndex);
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 fc07a2e9e..2cb667fd3 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java
@@ -429,18 +429,21 @@ public final class BeanDescriptorCacheHelp {
EntityBean bean = desc.createEntityBean();
desc.convertSetId(id, bean);
+ EntityBeanIntercept ebi = bean._ebean_getIntercept();
+ ebi.setBeanLoader(desc.getEbeanServer());
+
if (Boolean.TRUE.equals(readOnly)) {
- bean._ebean_getIntercept().setReadOnly(true);
+ ebi.setReadOnly(true);
}
beanLoadData(bean, data);
+
if (beanLog.isTraceEnabled()) {
beanLog.trace(" GET {}({}) - hit", cacheName, id);
}
return (T) bean;
}
-
/**
* Remove a bean from the cache given its Id.
*/
diff --git a/src/main/java/com/avaje/ebeaninternal/server/loadcontext/DLoadBeanContext.java b/src/main/java/com/avaje/ebeaninternal/server/loadcontext/DLoadBeanContext.java
index 2ed8d4d55..ec7420213 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/loadcontext/DLoadBeanContext.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/loadcontext/DLoadBeanContext.java
@@ -57,7 +57,7 @@ public class DLoadBeanContext extends DLoadBaseContext implements LoadBeanContex
currentBuffer = createBuffer(secondaryBatchSize);
}
// set the persistenceContext on the bean first
- ebi.setBeanLoader(0, currentBuffer, getPersistenceContext());
+ ebi.setBeanLoader(currentBuffer, getPersistenceContext());
currentBuffer.add(ebi);
}
diff --git a/src/test/java/com/avaje/tests/cache/TestL2CacheWithSharedBean.java b/src/test/java/com/avaje/tests/cache/TestL2CacheWithSharedBean.java
new file mode 100644
index 000000000..381da8236
--- /dev/null
+++ b/src/test/java/com/avaje/tests/cache/TestL2CacheWithSharedBean.java
@@ -0,0 +1,56 @@
+package com.avaje.tests.cache;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.avaje.ebean.BaseTestCase;
+import com.avaje.ebean.Ebean;
+import com.avaje.ebean.Query;
+import com.avaje.ebean.cache.ServerCache;
+import com.avaje.ebeaninternal.api.SpiQuery;
+import com.avaje.ebeaninternal.server.autofetch.TunedQueryInfo;
+import com.avaje.ebeaninternal.server.querydefn.OrmQueryDetail;
+import com.avaje.tests.model.basic.FeatureDescription;
+
+public class TestL2CacheWithSharedBean extends BaseTestCase {
+
+ @Test
+ public void test() {
+
+ FeatureDescription f1 = new FeatureDescription();
+ f1.setName("one");
+ f1.setDescription(null);
+
+ Ebean.save(f1);
+
+ ServerCache beanCache = Ebean.getServerCacheManager().getBeanCache(FeatureDescription.class);
+ beanCache.getStatistics(true);
+
+ OrmQueryDetail tunedDetail = new OrmQueryDetail();
+ tunedDetail.select("name");
+ TunedQueryInfo tunedInfo = new TunedQueryInfo(null, tunedDetail, 0);
+
+ Query query = Ebean.find(FeatureDescription.class).setId(f1.getId());
+
+ tunedInfo.autoFetchTune((SpiQuery>) query);
+
+ query.findUnique(); // PUT into cache
+
+ FeatureDescription fd2 = query.findUnique(); // LOAD cache
+
+ fd2.getDescription(); // invoke lazy load (this fails)
+
+ // load the cache
+ FeatureDescription fetchOne = Ebean.find(FeatureDescription.class, f1.getId());
+ Assert.assertNotNull(fetchOne);
+ Assert.assertEquals(1, beanCache.getStatistics(false).getSize());
+
+ FeatureDescription fetchTwo = Ebean.find(FeatureDescription.class, f1.getId());
+ FeatureDescription fetchThree = Ebean.find(FeatureDescription.class, f1.getId());
+ Assert.assertSame(fetchTwo, fetchThree);
+
+ String description = fetchThree.getDescription();
+ Assert.assertNull(description);
+ }
+
+}
diff --git a/src/test/java/com/avaje/tests/model/basic/FeatureDescription.java b/src/test/java/com/avaje/tests/model/basic/FeatureDescription.java
new file mode 100644
index 000000000..0fac2b2c6
--- /dev/null
+++ b/src/test/java/com/avaje/tests/model/basic/FeatureDescription.java
@@ -0,0 +1,44 @@
+package com.avaje.tests.model.basic;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import com.avaje.ebean.annotation.CacheStrategy;
+
+@CacheStrategy(readOnly = true, useBeanCache = true)
+@Entity
+@Table(name="feature_desc")
+public class FeatureDescription {
+
+ @Id
+ private Integer id;
+
+ private String name;
+
+ private String description;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+}
\ No newline at end of file