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