From ac1e1757e81f3af026ad73fbf028d552a0f96e59 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Wed, 20 Jul 2022 08:16:43 +1200 Subject: [PATCH] #2748 - Fix partially loaded bean scenario with .setDisableLazyLoading(true) .setBeanCacheMode(CacheMode.PUT) // force query to hit database --- .../server/query/SqlTreeLoadBean.java | 2 +- .../java/org/tests/o2m/OMVertexOther.java | 17 +++++++++++ .../o2m/TestOneToManyDuplicateInTxn.java | 29 ++++++++++++++++++- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoadBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoadBean.java index c12ff527a..a95ff951f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoadBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoadBean.java @@ -365,7 +365,7 @@ class SqlTreeLoadBean implements SqlTreeLoad { * context we need to check if it is already contained in the collection. */ final boolean isContextBean() { - return localBean == null; + return localBean == null || queryMode == Mode.LAZYLOAD_BEAN; } } diff --git a/ebean-test/src/test/java/org/tests/o2m/OMVertexOther.java b/ebean-test/src/test/java/org/tests/o2m/OMVertexOther.java index 237e4aa01..95ec6d101 100644 --- a/ebean-test/src/test/java/org/tests/o2m/OMVertexOther.java +++ b/ebean-test/src/test/java/org/tests/o2m/OMVertexOther.java @@ -11,8 +11,25 @@ public class OMVertexOther { private UUID id; private final String name; + private String other; public OMVertexOther(String name) { this.name = name; } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } + + public String getOther() { + return other; + } + + public void setOther(String other) { + this.other = other; + } } diff --git a/ebean-test/src/test/java/org/tests/o2m/TestOneToManyDuplicateInTxn.java b/ebean-test/src/test/java/org/tests/o2m/TestOneToManyDuplicateInTxn.java index 7e5bacd1d..5575cd061 100644 --- a/ebean-test/src/test/java/org/tests/o2m/TestOneToManyDuplicateInTxn.java +++ b/ebean-test/src/test/java/org/tests/o2m/TestOneToManyDuplicateInTxn.java @@ -29,7 +29,34 @@ class TestOneToManyDuplicateInTxn { OMVertex second = DB.find(OMVertex.class) //.setLoadBeanCache(true) - .setBeanCacheMode(CacheMode.PUT) + .setBeanCacheMode(CacheMode.PUT) // force query to hit database + .setDisableLazyLoading(true) + .fetch("related") + .where().eq("id", master.getId()) + .findOne(); + + assertThat(second.getRelated()).hasSize(1); + } + } + + @Test + void findTwice_partial() { + OMVertex master = new OMVertex(UUID.randomUUID()); + OMVertexOther child = new OMVertexOther("child"); + master.getRelated().add(child); + DB.save(master); + + try (Transaction txn = DB.beginTransaction()) { + OMVertex first = DB.find(OMVertex.class) + .setDisableLazyLoading(true) + .fetch("related", "name") // load a partially loaded bean + .where().eq("id", master.getId()) + .findOne(); + + assertThat(first.getRelated()).hasSize(1); + + OMVertex second = DB.find(OMVertex.class) + .setBeanCacheMode(CacheMode.PUT) // force query to hit database .setDisableLazyLoading(true) .fetch("related") .where().eq("id", master.getId())