Skip to content

Commit f2f4acb

Browse files
geoandDavideD
authored andcommitted
Introduce some FetchType.EAGER support
1 parent 1639aad commit f2f4acb

File tree

2 files changed

+118
-16
lines changed

2 files changed

+118
-16
lines changed

hibernate-reactive-core/src/main/java/org/hibernate/reactive/sql/exec/internal/StandardReactiveSelectExecutor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.hibernate.engine.spi.SharedSessionContractImplementor;
2525
import org.hibernate.internal.util.collections.ArrayHelper;
2626
import org.hibernate.query.TupleTransformer;
27+
import org.hibernate.reactive.engine.impl.ReactivePersistenceContextAdapter;
2728
import org.hibernate.reactive.logging.impl.Log;
2829
import org.hibernate.reactive.logging.impl.LoggerFactory;
2930
import org.hibernate.reactive.sql.exec.spi.ReactiveRowProcessingState;
@@ -117,6 +118,11 @@ public <T, R> CompletionStage<T> executeQuery(
117118
}
118119

119120
return doExecuteQuery( jdbcSelect, jdbcParameterBindings, executionContext, rowTransformer, domainResultType, statementCreator, resultsConsumer )
121+
.thenCompose( list ->
122+
// only initialize non-lazy collections after everything else has been refreshed
123+
((ReactivePersistenceContextAdapter) persistenceContext ).reactiveInitializeNonLazyCollections()
124+
.thenApply(v -> list)
125+
)
120126
.whenComplete( (o, throwable) -> {
121127
if ( readOnly != null ) {
122128
persistenceContext.setDefaultReadOnly( defaultReadOnlyOrig );

hibernate-reactive-core/src/test/java/org/hibernate/reactive/EagerTest.java

Lines changed: 112 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,10 @@ public void testEagerCollectionFetch(TestContext context) {
7575
.thenCompose( v -> openSession() )
7676
.thenCompose(s -> s.find( Node.class, basik.getId() ))
7777
.thenAccept( node -> {
78-
context.assertTrue( Hibernate.isInitialized( node.elements ) );
79-
context.assertEquals( 3, node.elements.size() );
80-
for ( Element element : node.elements ) {
81-
context.assertTrue( element.node == node );
78+
context.assertTrue( Hibernate.isInitialized( node.getElements() ) );
79+
context.assertEquals( 3, node.getElements().size() );
80+
for ( Element element : node.getElements() ) {
81+
context.assertTrue( element.getNode() == node );
8282
}
8383
} )
8484
);
@@ -97,11 +97,11 @@ public void testEagerParentFetch(TestContext context) {
9797
openSession()
9898
.thenCompose(s -> s.persist(basik).thenCompose(v -> s.flush()))
9999
.thenCompose( v -> openSession() )
100-
.thenCompose(s -> s.find( Element.class, basik.elements.get(0).id ))
100+
.thenCompose(s -> s.find( Element.class, basik.getElements().get(0).getId() ))
101101
.thenAccept( element -> {
102-
context.assertTrue( Hibernate.isInitialized( element.node ) );
103-
context.assertTrue( Hibernate.isInitialized( element.node.elements ) );
104-
context.assertEquals( 3, element.node.elements.size() );
102+
context.assertTrue( Hibernate.isInitialized( element.getNode() ) );
103+
context.assertTrue( Hibernate.isInitialized( element.getNode().getElements() ) );
104+
context.assertEquals( 3, element.getNode().getElements().size() );
105105
} )
106106
);
107107
}
@@ -122,9 +122,9 @@ public void testEagerParentFetchQuery(TestContext context) {
122122
.thenCompose(s -> s.createQuery( "from Element", Element.class ).getResultList())
123123
.thenAccept( elements -> {
124124
for (Element element: elements) {
125-
context.assertTrue( Hibernate.isInitialized( element.node ) );
126-
context.assertTrue( Hibernate.isInitialized( element.node.elements ) );
127-
context.assertEquals( 3, element.node.elements.size() );
125+
context.assertTrue( Hibernate.isInitialized( element.getNode() ) );
126+
context.assertTrue( Hibernate.isInitialized( element.getNode().getElements() ) );
127+
context.assertEquals( 3, element.getNode().getElements().size() );
128128
}
129129
} )
130130
);
@@ -146,17 +146,17 @@ public void testEagerFetchQuery(TestContext context) {
146146
.thenCompose(s -> s.createQuery("from Node order by id", Node.class).getResultList())
147147
.thenAccept(list -> {
148148
context.assertEquals(list.size(), 2);
149-
context.assertTrue( Hibernate.isInitialized( list.get(0).elements ) );
150-
context.assertEquals(list.get(0).elements.size(), 3);
151-
context.assertEquals(list.get(1).elements.size(), 0);
149+
context.assertTrue( Hibernate.isInitialized( list.get(0).getElements() ) );
150+
context.assertEquals(list.get(0).getElements().size(), 3);
151+
context.assertEquals(list.get(1).getElements().size(), 0);
152152
})
153153
.thenCompose( v -> openSession() )
154154
.thenCompose(s -> s.createQuery("select distinct n, e from Node n join n.elements e order by n.id").getResultList())
155155
.thenAccept(list -> {
156156
context.assertEquals(list.size(), 3);
157157
Object[] tup = (Object[]) list.get(0);
158-
context.assertTrue( Hibernate.isInitialized( ((Node) tup[0]).elements ) );
159-
context.assertEquals(((Node) tup[0]).elements.size(), 3);
158+
context.assertTrue( Hibernate.isInitialized( ((Node) tup[0]).getElements() ) );
159+
context.assertEquals(((Node) tup[0]).getElements().size(), 3);
160160
})
161161
);
162162
}
@@ -178,6 +178,22 @@ public Element(Node node) {
178178

179179
Element() {
180180
}
181+
182+
public Integer getId() {
183+
return id;
184+
}
185+
186+
public void setId(Integer id) {
187+
this.id = id;
188+
}
189+
190+
public Node getNode() {
191+
return node;
192+
}
193+
194+
public void setNode(Node node) {
195+
this.node = node;
196+
}
181197
}
182198

183199
@Entity(name = "Node")
@@ -299,5 +315,85 @@ public boolean equals(Object o) {
299315
public int hashCode() {
300316
return Objects.hash(string);
301317
}
318+
319+
public Integer getVersion() {
320+
return version;
321+
}
322+
323+
public void setVersion(Integer version) {
324+
this.version = version;
325+
}
326+
327+
public Node getParent() {
328+
return parent;
329+
}
330+
331+
public void setParent(Node parent) {
332+
this.parent = parent;
333+
}
334+
335+
public List<Element> getElements() {
336+
return elements;
337+
}
338+
339+
public void setElements(List<Element> elements) {
340+
this.elements = elements;
341+
}
342+
343+
public boolean isPrePersisted() {
344+
return prePersisted;
345+
}
346+
347+
public void setPrePersisted(boolean prePersisted) {
348+
this.prePersisted = prePersisted;
349+
}
350+
351+
public boolean isPostPersisted() {
352+
return postPersisted;
353+
}
354+
355+
public void setPostPersisted(boolean postPersisted) {
356+
this.postPersisted = postPersisted;
357+
}
358+
359+
public boolean isPreUpdated() {
360+
return preUpdated;
361+
}
362+
363+
public void setPreUpdated(boolean preUpdated) {
364+
this.preUpdated = preUpdated;
365+
}
366+
367+
public boolean isPostUpdated() {
368+
return postUpdated;
369+
}
370+
371+
public void setPostUpdated(boolean postUpdated) {
372+
this.postUpdated = postUpdated;
373+
}
374+
375+
public boolean isPostRemoved() {
376+
return postRemoved;
377+
}
378+
379+
public void setPostRemoved(boolean postRemoved) {
380+
this.postRemoved = postRemoved;
381+
}
382+
383+
public boolean isPreRemoved() {
384+
return preRemoved;
385+
}
386+
387+
public void setPreRemoved(boolean preRemoved) {
388+
this.preRemoved = preRemoved;
389+
}
390+
391+
public boolean isLoaded() {
392+
return loaded;
393+
}
394+
395+
public void setLoaded(boolean loaded) {
396+
this.loaded = loaded;
397+
}
302398
}
303399
}

0 commit comments

Comments
 (0)