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 826f3a15f..85f718fdb 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 @@ -175,14 +175,12 @@ final class DefaultBeanLoader { // need a new PersistenceContext for REFRESH pc = null; } - BeanDescriptor desc = server.descriptor(bean.getClass()); if (EntityType.EMBEDDED == desc.entityType()) { // lazy loading on an embedded bean property EntityBean embeddedOwner = (EntityBean) ebi.getEmbeddedOwner(); refreshBeanInternal(embeddedOwner, mode, ebi.getEmbeddedOwnerIndex()); } - Object id = desc.getId(bean); if (pc == null) { // a reference with no existing persistenceContext @@ -202,17 +200,16 @@ final class DefaultBeanLoader { } } } - SpiQuery query = server.createQuery(desc.type()); query.setLazyLoadProperty(ebi.getLazyLoadProperty()); if (draft) { query.asDraft(); + } else { + query.setIncludeSoftDeletes(); } - if (embeddedOwnerIndex > -1) { query.select(ebi.getProperty(embeddedOwnerIndex)); } - // don't collect AutoTune usage profiling information // as we just copy the data out of these fetched beans // and put the data into the original bean diff --git a/ebean-test/src/test/java/org/tests/cache/personinfo/PersonCacheInfo.java b/ebean-test/src/test/java/org/tests/cache/personinfo/PersonCacheInfo.java index 25d8e4d51..f7747b5bd 100644 --- a/ebean-test/src/test/java/org/tests/cache/personinfo/PersonCacheInfo.java +++ b/ebean-test/src/test/java/org/tests/cache/personinfo/PersonCacheInfo.java @@ -1,6 +1,7 @@ package org.tests.cache.personinfo; import io.ebean.annotation.Cache; +import io.ebean.annotation.SoftDelete; import javax.persistence.Entity; import javax.persistence.Id; @@ -16,6 +17,9 @@ public class PersonCacheInfo { private String name; + @SoftDelete + boolean deleted; + public PersonCacheInfo(String personId, String name) { this.personId = personId; this.name = name; @@ -36,4 +40,13 @@ public class PersonCacheInfo { public void setName(String name) { this.name = name; } + + public boolean deleted() { + return deleted; + } + + public PersonCacheInfo deleted(boolean deleted) { + this.deleted = deleted; + return this; + } } diff --git a/ebean-test/src/test/java/org/tests/cache/personinfo/PersonCacheTests.java b/ebean-test/src/test/java/org/tests/cache/personinfo/PersonCacheTests.java index bf23b590f..b944e4ca0 100644 --- a/ebean-test/src/test/java/org/tests/cache/personinfo/PersonCacheTests.java +++ b/ebean-test/src/test/java/org/tests/cache/personinfo/PersonCacheTests.java @@ -21,15 +21,12 @@ public class PersonCacheTests { private final List ids = Arrays.asList("E001", "E002", "E003"); - private ServerCache beanCacheInfo = DB.getDefault().cacheManager().beanCache(PersonCacheInfo.class); - private ServerCache beanCacheEmail = DB.getDefault().cacheManager().beanCache(PersonCacheEmail.class); - - private ServerCacheRegion region = DB.getDefault().cacheManager().region("email"); + private final ServerCache beanCacheInfo = DB.getDefault().cacheManager().beanCache(PersonCacheInfo.class); + private final ServerCache beanCacheEmail = DB.getDefault().cacheManager().beanCache(PersonCacheEmail.class); + private final ServerCacheRegion region = DB.getDefault().cacheManager().region("email"); private void insert(int id, String email) { - PersonCacheInfo person = new PersonCacheInfo("P00" + id, "P00" + id); - PersonCacheEmail personEmail = new PersonCacheEmail("E00" + id, email); personEmail.setPersonInfo(person); @@ -38,7 +35,6 @@ public class PersonCacheTests { } private void addTestData() { - insert(1, "testA"); insert(2, "testB"); insert(3, "testC"); diff --git a/ebean-test/src/test/java/org/tests/cache/personinfo/TestCacheSoftDeleteLazyLoad.java b/ebean-test/src/test/java/org/tests/cache/personinfo/TestCacheSoftDeleteLazyLoad.java new file mode 100644 index 000000000..927022117 --- /dev/null +++ b/ebean-test/src/test/java/org/tests/cache/personinfo/TestCacheSoftDeleteLazyLoad.java @@ -0,0 +1,49 @@ +package org.tests.cache.personinfo; + +import io.ebean.DB; +import io.ebean.test.LoggedSql; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class TestCacheSoftDeleteLazyLoad { + + private final String personEmailId = "SDLL-Email-01"; + private final String personId = "SDLL-Person-01"; + + void setup(){ + PersonCacheInfo person = new PersonCacheInfo(personId , "Hello"); + PersonCacheEmail personEmail = new PersonCacheEmail(personEmailId, "hello@foo.com"); + personEmail.setPersonInfo(person); + DB.save(person); + DB.save(personEmail); + } + + @Test + void softDeleteReferencedBean_when_lazyLoad_expect() { + setup(); + // load cache + DB.find(PersonCacheEmail.class, personEmailId); + + // soft delete our bean referenced by email + PersonCacheInfo info = DB.find(PersonCacheInfo.class, personId); + DB.delete(info); + + // load from cache (still references a now soft deleted bean) + PersonCacheEmail email2 = DB.find(PersonCacheEmail.class, personEmailId); + assert email2 != null; + + LoggedSql.start(); + PersonCacheInfo personInfo = email2.getPersonInfo(); + assertThat(personInfo).isNotNull(); + assertThat(personInfo.deleted()).isTrue(); // lazy load includes soft deletes + + List sql = LoggedSql.stop(); + assertThat(sql).hasSize(1); + assertThat(sql.get(0)) + .contains(" from person_cache_info t0 where t0.person_id = ?") + .doesNotContain("and t0.deleted ="); + } +} diff --git a/ebean-test/src/test/resources/logback-test.xml b/ebean-test/src/test/resources/logback-test.xml index bfe4a1ede..7277fcb2d 100644 --- a/ebean-test/src/test/resources/logback-test.xml +++ b/ebean-test/src/test/resources/logback-test.xml @@ -79,11 +79,11 @@ - - - + + + - +