Skip to content

Commit 8432d65

Browse files
committed
HHH-18017 Add test for issue
1 parent 471ebd6 commit 8432d65

File tree

1 file changed

+158
-0
lines changed

1 file changed

+158
-0
lines changed
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.orm.test.querycache;
8+
9+
import org.hibernate.cfg.AvailableSettings;
10+
import org.hibernate.engine.spi.SessionImplementor;
11+
import org.hibernate.jpa.HibernateHints;
12+
import org.hibernate.query.Query;
13+
import org.hibernate.stat.spi.StatisticsImplementor;
14+
15+
import org.hibernate.testing.orm.junit.DomainModel;
16+
import org.hibernate.testing.orm.junit.Jira;
17+
import org.hibernate.testing.orm.junit.ServiceRegistry;
18+
import org.hibernate.testing.orm.junit.SessionFactory;
19+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
20+
import org.hibernate.testing.orm.junit.Setting;
21+
import org.junit.jupiter.api.AfterAll;
22+
import org.junit.jupiter.api.BeforeAll;
23+
import org.junit.jupiter.api.Test;
24+
25+
import jakarta.persistence.DiscriminatorColumn;
26+
import jakarta.persistence.DiscriminatorType;
27+
import jakarta.persistence.DiscriminatorValue;
28+
import jakarta.persistence.Entity;
29+
import jakarta.persistence.Id;
30+
import jakarta.persistence.criteria.CriteriaBuilder;
31+
import jakarta.persistence.criteria.CriteriaQuery;
32+
import jakarta.persistence.criteria.Root;
33+
34+
import static org.assertj.core.api.Assertions.assertThat;
35+
36+
/**
37+
* @author Marco Belladelli
38+
*/
39+
@DomainModel( annotatedClasses = {
40+
SingleTableInheritanceQueryCacheTest.AbstractEntity.class,
41+
SingleTableInheritanceQueryCacheTest.EntityA.class,
42+
SingleTableInheritanceQueryCacheTest.SubEntityA.class,
43+
SingleTableInheritanceQueryCacheTest.EntityB.class,
44+
} )
45+
@SessionFactory
46+
@ServiceRegistry( settings = {
47+
@Setting( name = AvailableSettings.USE_QUERY_CACHE, value = "true" ),
48+
@Setting( name = AvailableSettings.GENERATE_STATISTICS, value = "true" ),
49+
} )
50+
@Jira( "https://hibernate.atlassian.net/browse/HHH-18017" )
51+
public class SingleTableInheritanceQueryCacheTest {
52+
@Test
53+
public void testHQL(SessionFactoryScope scope) {
54+
scope.inTransaction( session -> executeQuery( session, session.createQuery(
55+
"from AbstractEntity where id = 1",
56+
AbstractEntity.class
57+
), SubEntityA.class ) );
58+
}
59+
60+
@Test
61+
public void testCriteria(SessionFactoryScope scope) {
62+
scope.inTransaction( session -> {
63+
final CriteriaBuilder cb = session.getCriteriaBuilder();
64+
final CriteriaQuery<AbstractEntity> query = cb.createQuery( AbstractEntity.class );
65+
final Root<AbstractEntity> from = query.from( AbstractEntity.class );
66+
executeQuery(
67+
session,
68+
session.createQuery( query.where( cb.equal( from.get( "id" ), 2 ) ) ),
69+
EntityB.class
70+
);
71+
} );
72+
}
73+
74+
private void executeQuery(
75+
SessionImplementor session,
76+
Query<AbstractEntity> query,
77+
Class<? extends AbstractEntity> resultClass) {
78+
final StatisticsImplementor statistics = session.getSessionFactory().getStatistics();
79+
query.setHint( HibernateHints.HINT_CACHEABLE, true );
80+
for ( int i = 0; i < 2; i++ ) {
81+
statistics.clear();
82+
session.clear();
83+
final AbstractEntity result = query.getSingleResult();
84+
assertThat( result ).isExactlyInstanceOf( resultClass );
85+
assertThat( statistics.getQueryCacheHitCount() ).isEqualTo( i );
86+
assertThat( statistics.getQueryCachePutCount() ).isEqualTo( 1 - i );
87+
}
88+
}
89+
90+
@BeforeAll
91+
public void setUp(SessionFactoryScope scope) {
92+
scope.inTransaction( session -> {
93+
session.persist( new SubEntityA( 1L, "a1", 1 ) );
94+
session.persist( new EntityB( 2L, 2.0 ) );
95+
} );
96+
}
97+
98+
@AfterAll
99+
public void tearDown(SessionFactoryScope scope) {
100+
scope.inTransaction( session -> session.createMutationQuery( "delete from AbstractEntity" ).executeUpdate() );
101+
}
102+
103+
@Entity( name = "AbstractEntity" )
104+
@DiscriminatorColumn( name = "disc_col", discriminatorType = DiscriminatorType.INTEGER )
105+
static abstract class AbstractEntity {
106+
@Id
107+
private Long id;
108+
109+
public AbstractEntity() {
110+
}
111+
112+
public AbstractEntity(Long id) {
113+
this.id = id;
114+
}
115+
}
116+
117+
@Entity( name = "EntityA" )
118+
@DiscriminatorValue( "1" )
119+
static class EntityA extends AbstractEntity {
120+
private String aProp;
121+
122+
public EntityA() {
123+
}
124+
125+
public EntityA(Long id, String aProp) {
126+
super( id );
127+
this.aProp = aProp;
128+
}
129+
}
130+
131+
@Entity( name = "SubEntityA" )
132+
@DiscriminatorValue( "11" )
133+
static class SubEntityA extends EntityA {
134+
private Integer subAProp;
135+
136+
public SubEntityA() {
137+
}
138+
139+
public SubEntityA(Long id, String aProp, Integer subAProp) {
140+
super( id, aProp );
141+
this.subAProp = subAProp;
142+
}
143+
}
144+
145+
@Entity( name = "EntityB" )
146+
@DiscriminatorValue( "2" )
147+
static class EntityB extends AbstractEntity {
148+
private Double bProp;
149+
150+
public EntityB() {
151+
}
152+
153+
public EntityB(Long id, Double bProp) {
154+
super( id );
155+
this.bProp = bProp;
156+
}
157+
}
158+
}

0 commit comments

Comments
 (0)