Skip to content

Commit 83b6e6e

Browse files
committed
HHH-15105 Test and fix for NPE when access default query cache region statistics
1 parent 37ef062 commit 83b6e6e

File tree

2 files changed

+118
-0
lines changed

2 files changed

+118
-0
lines changed

hibernate-core/src/main/java/org/hibernate/cache/internal/EnabledCaching.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,10 @@ public QueryResultsCache getQueryResultsCacheStrictly(String regionName) {
491491
return null;
492492
}
493493

494+
if ( regionName == null || regionName.equals( getDefaultQueryResultsCache().getRegion().getName() ) ) {
495+
return getDefaultQueryResultsCache();
496+
}
497+
494498
return namedQueryResultsCacheMap.get( regionName );
495499
}
496500

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
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.test.cache;
8+
9+
import java.util.HashSet;
10+
import java.util.List;
11+
import java.util.Set;
12+
import javax.persistence.ElementCollection;
13+
import javax.persistence.Entity;
14+
import javax.persistence.Id;
15+
16+
import org.hibernate.boot.MetadataSources;
17+
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
18+
import org.hibernate.cfg.AvailableSettings;
19+
import org.hibernate.stat.CacheRegionStatistics;
20+
import org.hibernate.stat.Statistics;
21+
22+
import org.hibernate.testing.TestForIssue;
23+
import org.hibernate.testing.cache.CachingRegionFactory;
24+
import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase;
25+
import org.junit.After;
26+
import org.junit.Before;
27+
import org.junit.Test;
28+
29+
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
30+
import static org.junit.Assert.assertEquals;
31+
32+
/**
33+
* @author Christian Beikov
34+
*/
35+
public class CacheRegionStatisticsTest extends BaseNonConfigCoreFunctionalTestCase {
36+
37+
@Test
38+
@TestForIssue( jiraKey = "HHH-15105")
39+
public void testAccessDefaultQueryRegionStatistics() {
40+
final Statistics statistics = sessionFactory().getStatistics();
41+
final CacheRegionStatistics queryRegionStatistics = statistics.getQueryRegionStatistics(
42+
"default-query-results-region"
43+
);
44+
doInHibernate(
45+
this::sessionFactory, session -> {
46+
List<Dog> resultList = session.createQuery( "from Dog", Dog.class )
47+
.setCacheable( true )
48+
.getResultList();
49+
50+
assertEquals( 1, queryRegionStatistics.getMissCount() );
51+
}
52+
);
53+
}
54+
55+
@Override
56+
protected void configureStandardServiceRegistryBuilder(StandardServiceRegistryBuilder ssrb) {
57+
super.configureStandardServiceRegistryBuilder( ssrb );
58+
ssrb.applySetting( AvailableSettings.USE_SECOND_LEVEL_CACHE, true );
59+
ssrb.applySetting( AvailableSettings.USE_QUERY_CACHE, true );
60+
ssrb.applySetting( AvailableSettings.CACHE_REGION_FACTORY, new CachingRegionFactory() );
61+
ssrb.applySetting( AvailableSettings.GENERATE_STATISTICS, "true" );
62+
}
63+
64+
@Override
65+
protected void applyMetadataSources(MetadataSources metadataSources) {
66+
super.applyMetadataSources( metadataSources );
67+
metadataSources.addAnnotatedClass( Dog.class );
68+
}
69+
70+
@Before
71+
public void setupData() {
72+
doInHibernate(
73+
this::sessionFactory, session -> {
74+
Dog yogi = new Dog( "Yogi" );
75+
yogi.nickNames.add( "The Yog" );
76+
yogi.nickNames.add( "Little Boy" );
77+
yogi.nickNames.add( "Yogaroni Macaroni" );
78+
Dog irma = new Dog( "Irma" );
79+
irma.nickNames.add( "Squirmy" );
80+
irma.nickNames.add( "Bird" );
81+
session.persist( yogi );
82+
session.persist( irma );
83+
}
84+
);
85+
}
86+
87+
@After
88+
public void cleanupData() {
89+
doInHibernate(
90+
this::sessionFactory, session -> {
91+
List<Dog> dogs = session.createQuery( "from Dog", Dog.class ).getResultList();
92+
for ( Dog dog : dogs ) {
93+
session.delete( dog );
94+
}
95+
}
96+
);
97+
}
98+
99+
@Entity(name = "Dog")
100+
public static class Dog {
101+
@Id
102+
private String name;
103+
104+
@ElementCollection
105+
private Set<String> nickNames = new HashSet<>();
106+
107+
public Dog(String name) {
108+
this.name = name;
109+
}
110+
111+
public Dog() {
112+
}
113+
}
114+
}

0 commit comments

Comments
 (0)