From ba16cea405279b35642460009932c7eb896c4cf1 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Fri, 23 Nov 2018 12:20:18 +1300 Subject: [PATCH] #1556 - Query.setDisableLazyLoading(true) not working on @OneToMany Set (but does on List) --- src/main/java/io/ebean/common/BeanMap.java | 8 +- src/main/java/io/ebean/common/BeanSet.java | 10 +- .../batchload/TestQueryJoinToAssocOne.java | 96 ++++++++++++++++++- .../tests/query/other/TestOneToManyAsMap.java | 15 ++- 4 files changed, 113 insertions(+), 16 deletions(-) diff --git a/src/main/java/io/ebean/common/BeanMap.java b/src/main/java/io/ebean/common/BeanMap.java index 82a3c9853..406bd9f17 100644 --- a/src/main/java/io/ebean/common/BeanMap.java +++ b/src/main/java/io/ebean/common/BeanMap.java @@ -123,7 +123,7 @@ public final class BeanMap extends AbstractBeanCollection implements Ma private void initClear() { synchronized (this) { if (map == null) { - if (modifyListening) { + if (!disableLazyLoad && modifyListening) { lazyLoadCollection(true); } else { map = new LinkedHashMap<>(); @@ -135,7 +135,11 @@ public final class BeanMap extends AbstractBeanCollection implements Ma private void init() { synchronized (this) { if (map == null) { - lazyLoadCollection(false); + if (disableLazyLoad) { + map = new LinkedHashMap<>(); + } else { + lazyLoadCollection(false); + } } } } diff --git a/src/main/java/io/ebean/common/BeanSet.java b/src/main/java/io/ebean/common/BeanSet.java index c19564247..42872ad10 100644 --- a/src/main/java/io/ebean/common/BeanSet.java +++ b/src/main/java/io/ebean/common/BeanSet.java @@ -116,7 +116,7 @@ public final class BeanSet extends AbstractBeanCollection implements Set(); @@ -128,7 +128,11 @@ public final class BeanSet extends AbstractBeanCollection implements Set(); + } else { + lazyLoadCollection(true); + } } } } @@ -377,7 +381,7 @@ public final class BeanSet extends AbstractBeanCollection implements Set getShallowCopy() { BeanSet copy = new BeanSet<>(new LinkedHashSet<>(set)); diff --git a/src/test/java/org/tests/batchload/TestQueryJoinToAssocOne.java b/src/test/java/org/tests/batchload/TestQueryJoinToAssocOne.java index ffde77d3b..d1b697a70 100644 --- a/src/test/java/org/tests/batchload/TestQueryJoinToAssocOne.java +++ b/src/test/java/org/tests/batchload/TestQueryJoinToAssocOne.java @@ -3,12 +3,17 @@ package org.tests.batchload; import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.FetchConfig; +import org.ebeantest.LoggedSqlCollector; +import org.junit.Test; import org.tests.model.basic.Order; import org.tests.model.basic.OrderDetail; import org.tests.model.basic.ResetBasicData; -import org.ebeantest.LoggedSqlCollector; -import org.junit.Test; +import org.tests.model.m2m.Role; +import org.tests.model.m2m.Tenant; +import org.tests.model.map.MpRole; +import org.tests.model.map.MpUser; +import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -107,6 +112,93 @@ public class TestQueryJoinToAssocOne extends BaseTestCase { assertThat(secondaryQuery).contains(" order by t0.order_id, t0.id"); } + @Test + public void disableLazyLoading_when_oneToManyList() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + // This will use 2 SQL queries to build this object graph + List l0 = Ebean.find(Order.class) + .setDisableLazyLoading(true) + .select("status, shipDate") + .order().asc("id") + .findList(); + + assertThat(l0).isNotEmpty(); + + Order order = l0.get(0); + // try to invoke lazy loading on the bean + assertThat(order.getCustomer()).isNull(); + assertThat(order.getCretime()).isNull(); + + // try to invoke lazy loading on the OneToMany ... + List details = order.getDetails(); + assertThat(details).isEmpty(); + assertThat(details.size()).isEqualTo(0); + + List sql = LoggedSqlCollector.stop(); + assertThat(sql).hasSize(1); + } + + @Test + public void disableLazyLoad_when_oneToManySet() { + + Role role0 = new Role("r0"); + Role role1 = new Role("r1"); + Ebean.save(role0); + Ebean.save(role1); + + Tenant tenant = new Tenant("t0"); + tenant.getRoles().add(role0); + tenant.getRoles().add(role1); + + Ebean.save(tenant); + + LoggedSqlCollector.start(); + + Tenant found = Ebean.find(Tenant.class) + .setDisableLazyLoading(true) + .select("name") + .setId(tenant.getId()) + .findOne(); + + assertThat(found.getRoles().size()).isEqualTo(0); + + List sql = LoggedSqlCollector.stop(); + assertThat(sql).hasSize(1); + } + + @Test + public void disableLazyLoading_when_oneToManyMap() { + + MpRole r0 = new MpRole(); + r0.setCode("disableLazyLoading"); + + MpUser u = new MpUser(); + u.setName("disableLazy"); + u.getRoles().put("disableLazyLoading", r0); + Ebean.save(u); + + LoggedSqlCollector.start(); + + MpUser found = Ebean.find(MpUser.class) + .setDisableLazyLoading(true) + .select("name") + .setId(u.getId()) + .findOne(); + + // normally invokes lazy loading + assertThat(found.getRoles().size()).isEqualTo(0); + + // only 1 query ... no lazy loading query + List sql = LoggedSqlCollector.stop(); + assertThat(sql).hasSize(1); + + Ebean.deleteAll(Arrays.asList(found, r0)); + } + @Test public void testJoinOnPartiallyPopulatedParent_withLazyLoadingDisabled() { diff --git a/src/test/java/org/tests/query/other/TestOneToManyAsMap.java b/src/test/java/org/tests/query/other/TestOneToManyAsMap.java index 48fe3400c..a14930a3b 100644 --- a/src/test/java/org/tests/query/other/TestOneToManyAsMap.java +++ b/src/test/java/org/tests/query/other/TestOneToManyAsMap.java @@ -2,11 +2,10 @@ package org.tests.query.other; import io.ebean.BaseTestCase; import io.ebean.Ebean; -import io.ebean.EbeanServer; -import org.tests.model.map.MpRole; -import org.tests.model.map.MpUser; import org.junit.Assert; import org.junit.Test; +import org.tests.model.map.MpRole; +import org.tests.model.map.MpUser; import java.util.Map; @@ -15,21 +14,19 @@ public class TestOneToManyAsMap extends BaseTestCase { @Test public void test() { - EbeanServer eServer = Ebean.getServer(null); - MpUser u = new MpUser(); - eServer.save(u); + Ebean.save(u); - MpUser u2 = eServer.find(MpUser.class, u.getId()); + MpUser u2 = Ebean.find(MpUser.class, u.getId()); Assert.assertNotNull(u2); u2.setName("Charlie Brown"); MpRole ourl = new MpRole(); ourl.setOrganizationId(47L); u2.getRoles().put("one", ourl); - eServer.save(u2); + Ebean.save(u2); - MpUser u3 = eServer.find(MpUser.class, u.getId()); + MpUser u3 = Ebean.find(MpUser.class, u.getId()); Assert.assertEquals("Charlie Brown", u3.getName()); Map listMap = u3.getRoles();