| I am using 2nd level cache and I have not a cacheable City entity, this entity is mapped on a view and I've marked it as @Immutable: @Entity(name="city_view") @Immutable class City { @Id private Long id; private String name; } entityManager.createQuery("select c from City c", City.class).getResultList(); java.lang.NullPointerException at org.hibernate.engine.internal.CacheHelper.fromSharedCache(CacheHelper.java:55) at org.hibernate.engine.internal.CacheHelper.fromSharedCache(CacheHelper.java:67) at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1597) at org.hibernate.loader.Loader.getRow(Loader.java:1515) at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:726) at org.hibernate.loader.Loader.processResultSet(Loader.java:953) at org.hibernate.loader.Loader.doQuery(Loader.java:921) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355) at org.hibernate.loader.Loader.doList(Loader.java:2554) at org.hibernate.loader.Loader.doList(Loader.java:2540) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370) at org.hibernate.loader.Loader.list(Loader.java:2365) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387) at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236) at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1300) at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103) at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573) at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449) It can be reproduced just for query, for findOne it's ok. Exception is occurred due to cacheAccessStrategy is null in CacheHelper: public static Serializable fromSharedCache( SharedSessionContractImplementor session, Object cacheKey, RegionAccessStrategy cacheAccessStrategy) { final SessionEventListenerManager eventListenerManager = session.getEventListenerManager(); Serializable cachedValue = null; eventListenerManager.cacheGetStart(); try { cachedValue = (Serializable) *cacheAccessStrategy*.get( session, cacheKey, session.getTimestamp() ); } finally { eventListenerManager.cacheGetEnd( cachedValue != null ); } return cachedValue; } I've found the place why this piece of code is invoked. class Loader, method instanceNotYetLoaded: // see if the entity defines reference caching, and if so use the cached reference (if one). if ( session.getCacheMode().isGetEnabled() && persister.canUseReferenceCacheEntries() ) { final Object cachedEntry = CacheHelper.fromSharedCache( session, session.generateCacheKey( key.getIdentifier(), persister.getEntityMetamodel().getEntityType(), key.getEntityName() ), persister.getCacheAccessStrategy() ); if ( cachedEntry != null ) { CacheEntry entry = (CacheEntry) persister.getCacheEntryStructure().destructure( cachedEntry, factory ); return ( (ReferenceCacheEntryImpl) entry ).getReference(); } } If I disable hibernate.cache.use_reference_entries=false everything is fine. |