Skip to content

Commit e5bf40f

Browse files
committed
HHH-18855: Creation of a testcase
1 parent d779632 commit e5bf40f

File tree

1 file changed

+145
-0
lines changed

1 file changed

+145
-0
lines changed
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.fetch;
6+
7+
import jakarta.persistence.CascadeType;
8+
import jakarta.persistence.Entity;
9+
import jakarta.persistence.FetchType;
10+
import jakarta.persistence.Id;
11+
import jakarta.persistence.JoinTable;
12+
import jakarta.persistence.ManyToMany;
13+
import jakarta.persistence.ManyToOne;
14+
import jakarta.persistence.OneToMany;
15+
16+
import org.hibernate.Hibernate;
17+
import org.hibernate.annotations.Fetch;
18+
import org.hibernate.annotations.FetchMode;
19+
import org.hibernate.engine.spi.BatchFetchQueue;
20+
import org.hibernate.engine.spi.EntityKey;
21+
import org.hibernate.engine.spi.SessionImplementor;
22+
import org.hibernate.persister.entity.EntityPersister;
23+
24+
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
25+
import org.hibernate.testing.orm.junit.Jpa;
26+
import org.junit.jupiter.api.BeforeAll;
27+
import org.junit.jupiter.api.Test;
28+
29+
import java.util.HashSet;
30+
import java.util.Set;
31+
32+
import static org.hamcrest.MatcherAssert.assertThat;
33+
import static org.hamcrest.Matchers.is;
34+
import static org.hamcrest.Matchers.notNullValue;
35+
36+
@Jpa(annotatedClasses = {
37+
GenerateSubselectsOnJoinedAssociationTest.LazySelectRoot.class,
38+
GenerateSubselectsOnJoinedAssociationTest.LazySelectNode.class
39+
})
40+
public class GenerateSubselectsOnJoinedAssociationTest {
41+
42+
@BeforeAll
43+
static void setup(final EntityManagerFactoryScope scope) {
44+
scope.inTransaction( em -> {
45+
final LazySelectNode rootNode = new LazySelectNode();
46+
rootNode.id = 10;
47+
48+
final LazySelectNode child1 = new LazySelectNode();
49+
child1.id = 20;
50+
51+
final LazySelectNode child2 = new LazySelectNode();
52+
child2.id = 30;
53+
54+
final LazySelectRoot root = new LazySelectRoot();
55+
root.id = 1;
56+
57+
root.nodes.add( rootNode );
58+
root.nodes.add( child1 );
59+
root.nodes.add( child2 );
60+
rootNode.root = root;
61+
rootNode.children.add( child2 );
62+
rootNode.children.add( child1 );
63+
child1.root = root;
64+
child2.root = root;
65+
66+
em.persist( root );
67+
} );
68+
}
69+
70+
@Test
71+
void testSubselectFetchingFromFind(final EntityManagerFactoryScope scope) {
72+
final LazySelectRoot root = scope.fromTransaction( em -> {
73+
final SessionImplementor session = em.unwrap( SessionImplementor.class );
74+
final EntityPersister persister = session.getEntityPersister( null, new LazySelectNode() );
75+
final EntityKey key1 = session.generateEntityKey( 10, persister );
76+
final EntityKey key2 = session.generateEntityKey( 20, persister );
77+
final EntityKey key3 = session.generateEntityKey( 30, persister );
78+
79+
final LazySelectRoot in = em.find( LazySelectRoot.class, 1L );
80+
81+
final BatchFetchQueue batchFetchQueue = session.getPersistenceContextInternal().getBatchFetchQueue();
82+
assertThat( batchFetchQueue.getSubselect( key1 ), is( notNullValue() ) );
83+
assertThat( batchFetchQueue.getSubselect( key2 ), is( notNullValue() ) );
84+
assertThat( batchFetchQueue.getSubselect( key3 ), is( notNullValue() ) );
85+
86+
return in;
87+
} );
88+
89+
for ( final LazySelectNode node : root.nodes ) {
90+
assertThat( Hibernate.isInitialized( ( (LazySelectNode) Hibernate.unproxy( node ) ).children ),
91+
is( false )
92+
);
93+
}
94+
}
95+
96+
@Test
97+
void testSubselectFetchingFromQuery(final EntityManagerFactoryScope scope) {
98+
final LazySelectRoot root = scope.fromTransaction( em -> {
99+
final SessionImplementor session = em.unwrap( SessionImplementor.class );
100+
final EntityPersister persister = session.getEntityPersister( null, new LazySelectNode() );
101+
final EntityKey key1 = session.generateEntityKey( 10, persister );
102+
final EntityKey key2 = session.generateEntityKey( 20, persister );
103+
final EntityKey key3 = session.generateEntityKey( 30, persister );
104+
105+
final LazySelectRoot in = em.createQuery( "select r from root r join fetch r.nodes where r.id = ?1",
106+
LazySelectRoot.class ).setParameter( 1, 1 ).getSingleResult();
107+
108+
final BatchFetchQueue batchFetchQueue = session.getPersistenceContextInternal().getBatchFetchQueue();
109+
assertThat( batchFetchQueue.getSubselect( key1 ), is( notNullValue() ) );
110+
assertThat( batchFetchQueue.getSubselect( key2 ), is( notNullValue() ) );
111+
assertThat( batchFetchQueue.getSubselect( key3 ), is( notNullValue() ) );
112+
return in;
113+
} );
114+
115+
for ( final LazySelectNode node : root.nodes ) {
116+
assertThat( Hibernate.isInitialized( ( (LazySelectNode) Hibernate.unproxy( node ) ).children ),
117+
is( false )
118+
);
119+
}
120+
}
121+
122+
@Entity(name = "root")
123+
public static class LazySelectRoot {
124+
@Id
125+
public Integer id;
126+
127+
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "root")
128+
public Set<LazySelectNode> nodes = new HashSet<>();
129+
}
130+
131+
@Entity(name = "node")
132+
public static class LazySelectNode {
133+
134+
@Id
135+
public Integer id;
136+
137+
@ManyToOne(cascade = CascadeType.ALL)
138+
public LazySelectRoot root;
139+
140+
@ManyToMany(cascade = CascadeType.ALL)
141+
@JoinTable(name = "RELATIONSHIPS")
142+
@Fetch(FetchMode.SUBSELECT)
143+
public final Set<LazySelectNode> children = new HashSet<>();
144+
}
145+
}

0 commit comments

Comments
 (0)