88import org .hibernate .LockMode ;
99import org .hibernate .LockOptions ;
1010import org .hibernate .bytecode .enhance .spi .interceptor .EnhancementAsProxyLazinessInterceptor ;
11- import org .hibernate .cache .spi .access .CollectionDataAccess ;
12- import org .hibernate .cache .spi .access .EntityDataAccess ;
1311import org .hibernate .cache .spi .entry .CacheEntry ;
1412import org .hibernate .cache .spi .entry .CollectionCacheEntry ;
1513import org .hibernate .cache .spi .entry .ReferenceCacheEntryImpl ;
1614import org .hibernate .cache .spi .entry .StandardCacheEntryImpl ;
1715import org .hibernate .collection .spi .PersistentCollection ;
1816import org .hibernate .engine .internal .TwoPhaseLoad ;
1917import org .hibernate .engine .spi .EntityEntry ;
20- import org .hibernate .engine .spi .EntityHolder ;
2118import org .hibernate .engine .spi .EntityKey ;
22- import org .hibernate .engine .spi .PersistenceContext ;
23- import org .hibernate .engine .spi .PersistentAttributeInterceptor ;
24- import org .hibernate .engine .spi .SessionFactoryImplementor ;
2519import org .hibernate .engine .spi .SharedSessionContractImplementor ;
2620import org .hibernate .engine .spi .Status ;
2721import org .hibernate .event .spi .LoadEventListener ;
28- import org .hibernate .metamodel .model .domain .NavigableRole ;
2922import org .hibernate .persister .collection .CollectionPersister ;
3023import org .hibernate .persister .entity .EntityPersister ;
31- import org .hibernate .proxy .LazyInitializer ;
32- import org .hibernate .stat .spi .StatisticsImplementor ;
3324import org .hibernate .type .Type ;
3425import org .hibernate .type .TypeHelper ;
3526
@@ -77,32 +68,46 @@ private CacheLoadHelper() {
7768 *
7869 * @throws HibernateException Generally indicates problems applying a lock mode.
7970 */
80- public static PersistenceContextEntry loadFromSessionCache (EntityKey keyToLoad , LockOptions lockOptions , LoadEventListener .LoadType options , SharedSessionContractImplementor session ) {
71+ public static PersistenceContextEntry loadFromSessionCache (
72+ EntityKey keyToLoad ,
73+ LockOptions lockOptions ,
74+ LoadEventListener .LoadType options ,
75+ SharedSessionContractImplementor session ) {
8176 final Object old = session .getEntityUsingInterceptor ( keyToLoad );
82- PersistenceContextEntry .EntityStatus entityStatus = MANAGED ;
77+ final PersistenceContextEntry .EntityStatus entityStatus ;
8378 if ( old != null ) {
8479 // this object was already loaded
85- final EntityEntry oldEntry = session .getPersistenceContext ().getEntry ( old );
80+ final var oldEntry = session .getPersistenceContext ().getEntry ( old );
8681 entityStatus = entityStatus ( keyToLoad , options , session , oldEntry , old );
8782 if ( entityStatus == MANAGED ) {
8883 upgradeLock ( old , oldEntry , lockOptions , session );
8984 }
9085 }
86+ else {
87+ entityStatus = MANAGED ;
88+ }
9189 return new PersistenceContextEntry ( old , entityStatus );
9290 }
9391
9492 // Used by Hibernate Reactive
95- public static PersistenceContextEntry .EntityStatus entityStatus (EntityKey keyToLoad , LoadEventListener .LoadType options , SharedSessionContractImplementor session , EntityEntry oldEntry , Object old ) {
93+ public static PersistenceContextEntry .EntityStatus entityStatus (
94+ EntityKey keyToLoad ,
95+ LoadEventListener .LoadType options ,
96+ SharedSessionContractImplementor session ,
97+ EntityEntry oldEntry ,
98+ Object old ) {
9699 if ( options .isCheckDeleted () && oldEntry .getStatus ().isDeletedOrGone () ) {
97100 LOADING_LOGGER .foundEntityScheduledForRemoval ();
98101 return REMOVED_ENTITY_MARKER ;
99102 }
100- if ( options .isAllowNulls () && !session .getFactory ().getMappingMetamodel ()
103+ else if ( options .isAllowNulls () && !session .getFactory ().getMappingMetamodel ()
101104 .getEntityDescriptor ( keyToLoad .getEntityName () ).isInstance ( old ) ) {
102105 LOADING_LOGGER .foundEntityWrongType ();
103106 return INCONSISTENT_RTN_CLASS_MARKER ;
104107 }
105- return MANAGED ;
108+ else {
109+ return MANAGED ;
110+ }
106111 }
107112
108113 /**
@@ -127,9 +132,8 @@ public static Object loadFromSecondLevelCache(
127132 && source .getCacheMode ().isGetEnabled ()
128133 && lockMode .lessThan ( LockMode .READ );
129134 if ( useCache ) {
130- final Object ce = getFromSharedCache ( entityKey .getIdentifier (), persister , source );
131- // nothing was found in cache
132- return ce == null ? null : processCachedEntry ( entity , persister , ce , source , entityKey );
135+ final Object cacheEntry = getFromSharedCache ( entityKey .getIdentifier (), persister , source );
136+ return cacheEntry == null ? null : processCachedEntry ( entity , persister , cacheEntry , source , entityKey );
133137 }
134138 else {
135139 // we can't use cache here
@@ -140,38 +144,33 @@ public static Object loadFromSecondLevelCache(
140144 private static Object getFromSharedCache (
141145 final Object entityId ,
142146 final EntityPersister persister ,
143- SharedSessionContractImplementor source ) {
144- final EntityDataAccess cache = persister .getCacheAccessStrategy ();
145- final SessionFactoryImplementor factory = source .getFactory ();
146- final Object cacheKey = cache .generateCacheKey (
147- entityId ,
148- persister ,
149- factory ,
150- source .getTenantIdentifier ()
151- );
152- final Object ce = fromSharedCache ( source , cacheKey , persister , persister .getCacheAccessStrategy () );
153- final StatisticsImplementor statistics = factory .getStatistics ();
147+ final SharedSessionContractImplementor source ) {
148+ final var cache = persister .getCacheAccessStrategy ();
149+ final var factory = source .getFactory ();
150+ final Object cacheKey = cache .generateCacheKey ( entityId , persister , factory , source .getTenantIdentifier () );
151+ final Object cacheEntry = fromSharedCache ( source , cacheKey , persister , persister .getCacheAccessStrategy () );
152+ final var statistics = factory .getStatistics ();
154153 if ( statistics .isStatisticsEnabled () ) {
155- final NavigableRole rootEntityRole = getRootEntityRole ( persister );
154+ final var rootEntityRole = getRootEntityRole ( persister );
156155 final String regionName = cache .getRegion ().getName ();
157- if ( ce == null ) {
156+ if ( cacheEntry == null ) {
158157 statistics .entityCacheMiss ( rootEntityRole , regionName );
159158 }
160159 else {
161160 statistics .entityCacheHit ( rootEntityRole , regionName );
162161 }
163162 }
164- return ce ;
163+ return cacheEntry ;
165164 }
166165
167166 private static Object processCachedEntry (
168167 final Object instanceToLoad ,
169168 final EntityPersister persister ,
170- final Object ce ,
169+ final Object cacheEntry ,
171170 final SharedSessionContractImplementor source ,
172171 final EntityKey entityKey ) {
173- final CacheEntry entry = (CacheEntry )
174- persister .getCacheEntryStructure ().destructure ( ce , source .getFactory () );
172+ final var entry = (CacheEntry )
173+ persister .getCacheEntryStructure ().destructure ( cacheEntry , source .getFactory () );
175174 if ( entry .isReferenceEntry () ) {
176175 if ( instanceToLoad != null ) {
177176 throw new HibernateException ( "Attempt to load entity from cache using provided object instance, "
@@ -192,8 +191,8 @@ private static Object processCachedEntry(
192191 entityKey
193192 );
194193 if ( !persister .isInstance ( entity ) ) {
195- // Cleanup the inconsistent return class entity from the persistence context
196- final PersistenceContext persistenceContext = source .getPersistenceContext ();
194+ // Clean up the inconsistent return class entity from the persistence context
195+ final var persistenceContext = source .getPersistenceContext ();
197196 persistenceContext .removeEntry ( entity );
198197 persistenceContext .removeEntity ( entityKey );
199198 return null ;
@@ -222,12 +221,10 @@ private static void makeEntityCircularReferenceSafe(
222221 Object entity ,
223222 EntityKey entityKey ) {
224223 // make it circular-reference safe
225- final PersistenceContext persistenceContext = session .getPersistenceContext ();
224+ final var persistenceContext = session .getPersistenceContext ();
226225 if ( isManagedEntity ( entity ) ) {
227- final EntityHolder entityHolder =
228- persistenceContext .addEntityHolder ( entityKey , entity );
229- final EntityEntry entityEntry =
230- persistenceContext .addReferenceEntry ( entity , Status .READ_ONLY );
226+ final var entityHolder = persistenceContext .addEntityHolder ( entityKey , entity );
227+ final var entityEntry = persistenceContext .addReferenceEntry ( entity , Status .READ_ONLY );
231228 entityHolder .setEntityEntry ( entityEntry );
232229 }
233230 else {
@@ -251,30 +248,26 @@ private static Object convertCacheEntryToEntity(
251248 Object instanceToLoad ,
252249 EntityKey entityKey ) {
253250
254- final EntityPersister subclassPersister =
251+ final var subclassPersister =
255252 source .getFactory ().getMappingMetamodel ()
256253 .getEntityDescriptor ( entry .getSubclass () );
257- final PersistenceContext persistenceContext = source .getPersistenceContextInternal ();
258- final EntityHolder oldHolder = persistenceContext .getEntityHolder ( entityKey );
254+ final var persistenceContext = source .getPersistenceContextInternal ();
255+ final var oldHolder = persistenceContext .getEntityHolder ( entityKey );
259256
260257 final Object entity ;
261258 if ( instanceToLoad != null ) {
262259 entity = instanceToLoad ;
263260 }
264261 else {
265- if ( oldHolder != null && oldHolder .getEntity () != null ) {
266- // Use the entity which might already be
267- entity = oldHolder .getEntity ();
268- }
269- else {
270- entity = source .instantiate ( subclassPersister , entityId );
271- }
262+ entity = oldHolder != null && oldHolder .getEntity () != null
263+ ? oldHolder .getEntity ()
264+ : source .instantiate ( subclassPersister , entityId );
272265 }
273266
274267 if ( isPersistentAttributeInterceptable ( entity ) ) {
275- PersistentAttributeInterceptor persistentAttributeInterceptor =
268+ final var persistentAttributeInterceptor =
276269 asPersistentAttributeInterceptable ( entity ).$$_hibernate_getInterceptor ();
277- // if we do this after the entity has been initialized the
270+ // if we do this after the entity has been initialized, the
278271 // BytecodeLazyAttributeInterceptor#isAttributeLoaded(String fieldName)
279272 // would return false
280273 if ( persistentAttributeInterceptor == null
@@ -285,13 +278,13 @@ private static Object convertCacheEntryToEntity(
285278 }
286279
287280 // make it circular-reference safe
288- final EntityHolder holder = persistenceContext .addEntityHolder ( entityKey , entity );
281+ final var holder = persistenceContext .addEntityHolder ( entityKey , entity );
289282 final Object proxy = holder .getProxy ();
290283 final boolean isReadOnly ;
291284 if ( proxy != null ) {
292285 // there is already a proxy for this impl
293286 // only set the status to read-only if the proxy is read-only
294- final LazyInitializer lazyInitializer = extractLazyInitializer ( proxy );
287+ final var lazyInitializer = extractLazyInitializer ( proxy );
295288 assert lazyInitializer != null ;
296289 lazyInitializer .setImplementation ( entity );
297290 isReadOnly = lazyInitializer .isReadOnly ();
@@ -316,7 +309,7 @@ private static Object convertCacheEntryToEntity(
316309
317310 final Type [] types = subclassPersister .getPropertyTypes ();
318311 // initializes the entity by (desired) side effect
319- final StandardCacheEntryImpl standardCacheEntry = (StandardCacheEntryImpl ) entry ;
312+ final var standardCacheEntry = (StandardCacheEntryImpl ) entry ;
320313 final Object [] values = standardCacheEntry .assemble (
321314 entity ,
322315 entityId ,
@@ -334,7 +327,7 @@ private static Object convertCacheEntryToEntity(
334327 );
335328 }
336329 final Object version = getVersion ( values , subclassPersister );
337- final EntityEntry entityEntry = persistenceContext .addEntry (
330+ final var entityEntry = persistenceContext .addEntry (
338331 entity ,
339332 isReadOnly ? Status .READ_ONLY : Status .MANAGED ,
340333 values ,
@@ -346,9 +339,7 @@ private static Object convertCacheEntryToEntity(
346339 subclassPersister ,
347340 false
348341 );
349- holder .setEntityEntry (
350- entityEntry
351- );
342+ holder .setEntityEntry ( entityEntry );
352343 subclassPersister .afterInitialize ( entity , source );
353344 entityEntry .postLoad ( entity );
354345 persistenceContext .initializeNonLazyCollections ();
@@ -372,43 +363,58 @@ public static boolean initializeCollectionFromCache(
372363 CollectionPersister persister ,
373364 PersistentCollection <?> collection ,
374365 SharedSessionContractImplementor source ) {
375-
376366 if ( persister .hasCache () && source .getCacheMode ().isGetEnabled () ) {
377- final SessionFactoryImplementor factory = source .getFactory ();
378- final CollectionDataAccess cacheAccessStrategy = persister .getCacheAccessStrategy ();
379- final Object ck = cacheAccessStrategy .generateCacheKey ( key , persister , factory , source .getTenantIdentifier () );
380- final Object ce = fromSharedCache ( source , ck , persister , cacheAccessStrategy );
381-
382- final StatisticsImplementor statistics = factory .getStatistics ();
383- if ( statistics .isStatisticsEnabled () ) {
384- final NavigableRole navigableRole = persister .getNavigableRole ();
385- final String regionName = cacheAccessStrategy .getRegion ().getName ();
386- if ( ce == null ) {
387- statistics .collectionCacheMiss ( navigableRole , regionName );
388- }
389- else {
390- statistics .collectionCacheHit ( navigableRole , regionName );
391- }
392- }
393-
394- if ( ce == null ) {
367+ final Object cachedEntry = getFromSharedCache ( key , persister , source );
368+ if ( cachedEntry == null ) {
395369 return false ;
396370 }
397371 else {
398- final CollectionCacheEntry cacheEntry = (CollectionCacheEntry )
399- persister .getCacheEntryStructure ().destructure ( ce , factory );
400- final PersistenceContext persistenceContext = source .getPersistenceContextInternal ();
401- cacheEntry .assemble ( collection , persister , persistenceContext .getCollectionOwner ( key , persister ) );
402- persistenceContext .getCollectionEntry ( collection ).postInitialize ( collection , source );
403- // addInitializedCollection(collection, persister, key);
372+ processCachedEntry ( key , persister , cachedEntry , collection , source );
404373 return true ;
405374 }
406375 }
407376 else {
377+ // we can't use cache here
408378 return false ;
409379 }
410380 }
411381
382+ private static void processCachedEntry (
383+ Object key ,
384+ CollectionPersister persister ,
385+ Object cachedEntry ,
386+ PersistentCollection <?> collection ,
387+ SharedSessionContractImplementor source ) {
388+ final var cacheEntry = (CollectionCacheEntry )
389+ persister .getCacheEntryStructure ().destructure ( cachedEntry , source .getFactory () );
390+ final var persistenceContext = source .getPersistenceContextInternal ();
391+ cacheEntry .assemble ( collection , persister , persistenceContext .getCollectionOwner ( key , persister ) );
392+ persistenceContext .getCollectionEntry ( collection ).postInitialize ( collection , source );
393+ // addInitializedCollection(collection, persister, key);
394+ }
395+
396+ private static Object getFromSharedCache (
397+ Object key ,
398+ CollectionPersister persister ,
399+ SharedSessionContractImplementor source ) {
400+ final var factory = source .getFactory ();
401+ final var cache = persister .getCacheAccessStrategy ();
402+ final Object cacheKey = cache .generateCacheKey ( key , persister , factory , source .getTenantIdentifier () );
403+ final Object cachedEntry = fromSharedCache ( source , cacheKey , persister , cache );
404+ final var statistics = factory .getStatistics ();
405+ if ( statistics .isStatisticsEnabled () ) {
406+ final var navigableRole = persister .getNavigableRole ();
407+ final String regionName = cache .getRegion ().getName ();
408+ if ( cachedEntry == null ) {
409+ statistics .collectionCacheMiss ( navigableRole , regionName );
410+ }
411+ else {
412+ statistics .collectionCacheHit ( navigableRole , regionName );
413+ }
414+ }
415+ return cachedEntry ;
416+ }
417+
412418 public record PersistenceContextEntry (Object entity , EntityStatus status ) {
413419 public enum EntityStatus {
414420 MANAGED ,
0 commit comments