Skip to content

Commit 93395cb

Browse files
committed
HHH-18855: Creation of a testcase
1 parent ef3250c commit 93395cb

File tree

1 file changed

+136
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)