8
8
import org .hibernate .LockMode ;
9
9
import org .hibernate .LockOptions ;
10
10
import org .hibernate .bytecode .enhance .spi .interceptor .EnhancementAsProxyLazinessInterceptor ;
11
- import org .hibernate .cache .spi .access .CollectionDataAccess ;
12
- import org .hibernate .cache .spi .access .EntityDataAccess ;
13
11
import org .hibernate .cache .spi .entry .CacheEntry ;
14
12
import org .hibernate .cache .spi .entry .CollectionCacheEntry ;
15
13
import org .hibernate .cache .spi .entry .ReferenceCacheEntryImpl ;
16
14
import org .hibernate .cache .spi .entry .StandardCacheEntryImpl ;
17
15
import org .hibernate .collection .spi .PersistentCollection ;
18
16
import org .hibernate .engine .internal .TwoPhaseLoad ;
19
17
import org .hibernate .engine .spi .EntityEntry ;
20
- import org .hibernate .engine .spi .EntityHolder ;
21
18
import 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 ;
25
19
import org .hibernate .engine .spi .SharedSessionContractImplementor ;
26
20
import org .hibernate .engine .spi .Status ;
27
21
import org .hibernate .event .spi .LoadEventListener ;
28
- import org .hibernate .metamodel .model .domain .NavigableRole ;
29
22
import org .hibernate .persister .collection .CollectionPersister ;
30
23
import org .hibernate .persister .entity .EntityPersister ;
31
- import org .hibernate .proxy .LazyInitializer ;
32
- import org .hibernate .stat .spi .StatisticsImplementor ;
33
24
import org .hibernate .type .Type ;
34
25
import org .hibernate .type .TypeHelper ;
35
26
@@ -77,32 +68,46 @@ private CacheLoadHelper() {
77
68
*
78
69
* @throws HibernateException Generally indicates problems applying a lock mode.
79
70
*/
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 ) {
81
76
final Object old = session .getEntityUsingInterceptor ( keyToLoad );
82
- PersistenceContextEntry .EntityStatus entityStatus = MANAGED ;
77
+ final PersistenceContextEntry .EntityStatus entityStatus ;
83
78
if ( old != null ) {
84
79
// this object was already loaded
85
- final EntityEntry oldEntry = session .getPersistenceContext ().getEntry ( old );
80
+ final var oldEntry = session .getPersistenceContext ().getEntry ( old );
86
81
entityStatus = entityStatus ( keyToLoad , options , session , oldEntry , old );
87
82
if ( entityStatus == MANAGED ) {
88
83
upgradeLock ( old , oldEntry , lockOptions , session );
89
84
}
90
85
}
86
+ else {
87
+ entityStatus = MANAGED ;
88
+ }
91
89
return new PersistenceContextEntry ( old , entityStatus );
92
90
}
93
91
94
92
// 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 ) {
96
99
if ( options .isCheckDeleted () && oldEntry .getStatus ().isDeletedOrGone () ) {
97
100
LOADING_LOGGER .foundEntityScheduledForRemoval ();
98
101
return REMOVED_ENTITY_MARKER ;
99
102
}
100
- if ( options .isAllowNulls () && !session .getFactory ().getMappingMetamodel ()
103
+ else if ( options .isAllowNulls () && !session .getFactory ().getMappingMetamodel ()
101
104
.getEntityDescriptor ( keyToLoad .getEntityName () ).isInstance ( old ) ) {
102
105
LOADING_LOGGER .foundEntityWrongType ();
103
106
return INCONSISTENT_RTN_CLASS_MARKER ;
104
107
}
105
- return MANAGED ;
108
+ else {
109
+ return MANAGED ;
110
+ }
106
111
}
107
112
108
113
/**
@@ -127,9 +132,8 @@ public static Object loadFromSecondLevelCache(
127
132
&& source .getCacheMode ().isGetEnabled ()
128
133
&& lockMode .lessThan ( LockMode .READ );
129
134
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 );
133
137
}
134
138
else {
135
139
// we can't use cache here
@@ -140,38 +144,33 @@ public static Object loadFromSecondLevelCache(
140
144
private static Object getFromSharedCache (
141
145
final Object entityId ,
142
146
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 ();
154
153
if ( statistics .isStatisticsEnabled () ) {
155
- final NavigableRole rootEntityRole = getRootEntityRole ( persister );
154
+ final var rootEntityRole = getRootEntityRole ( persister );
156
155
final String regionName = cache .getRegion ().getName ();
157
- if ( ce == null ) {
156
+ if ( cacheEntry == null ) {
158
157
statistics .entityCacheMiss ( rootEntityRole , regionName );
159
158
}
160
159
else {
161
160
statistics .entityCacheHit ( rootEntityRole , regionName );
162
161
}
163
162
}
164
- return ce ;
163
+ return cacheEntry ;
165
164
}
166
165
167
166
private static Object processCachedEntry (
168
167
final Object instanceToLoad ,
169
168
final EntityPersister persister ,
170
- final Object ce ,
169
+ final Object cacheEntry ,
171
170
final SharedSessionContractImplementor source ,
172
171
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 () );
175
174
if ( entry .isReferenceEntry () ) {
176
175
if ( instanceToLoad != null ) {
177
176
throw new HibernateException ( "Attempt to load entity from cache using provided object instance, "
@@ -192,8 +191,8 @@ private static Object processCachedEntry(
192
191
entityKey
193
192
);
194
193
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 ();
197
196
persistenceContext .removeEntry ( entity );
198
197
persistenceContext .removeEntity ( entityKey );
199
198
return null ;
@@ -222,12 +221,10 @@ private static void makeEntityCircularReferenceSafe(
222
221
Object entity ,
223
222
EntityKey entityKey ) {
224
223
// make it circular-reference safe
225
- final PersistenceContext persistenceContext = session .getPersistenceContext ();
224
+ final var persistenceContext = session .getPersistenceContext ();
226
225
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 );
231
228
entityHolder .setEntityEntry ( entityEntry );
232
229
}
233
230
else {
@@ -251,30 +248,26 @@ private static Object convertCacheEntryToEntity(
251
248
Object instanceToLoad ,
252
249
EntityKey entityKey ) {
253
250
254
- final EntityPersister subclassPersister =
251
+ final var subclassPersister =
255
252
source .getFactory ().getMappingMetamodel ()
256
253
.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 );
259
256
260
257
final Object entity ;
261
258
if ( instanceToLoad != null ) {
262
259
entity = instanceToLoad ;
263
260
}
264
261
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 );
272
265
}
273
266
274
267
if ( isPersistentAttributeInterceptable ( entity ) ) {
275
- PersistentAttributeInterceptor persistentAttributeInterceptor =
268
+ final var persistentAttributeInterceptor =
276
269
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
278
271
// BytecodeLazyAttributeInterceptor#isAttributeLoaded(String fieldName)
279
272
// would return false
280
273
if ( persistentAttributeInterceptor == null
@@ -285,13 +278,13 @@ private static Object convertCacheEntryToEntity(
285
278
}
286
279
287
280
// make it circular-reference safe
288
- final EntityHolder holder = persistenceContext .addEntityHolder ( entityKey , entity );
281
+ final var holder = persistenceContext .addEntityHolder ( entityKey , entity );
289
282
final Object proxy = holder .getProxy ();
290
283
final boolean isReadOnly ;
291
284
if ( proxy != null ) {
292
285
// there is already a proxy for this impl
293
286
// 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 );
295
288
assert lazyInitializer != null ;
296
289
lazyInitializer .setImplementation ( entity );
297
290
isReadOnly = lazyInitializer .isReadOnly ();
@@ -316,7 +309,7 @@ private static Object convertCacheEntryToEntity(
316
309
317
310
final Type [] types = subclassPersister .getPropertyTypes ();
318
311
// initializes the entity by (desired) side effect
319
- final StandardCacheEntryImpl standardCacheEntry = (StandardCacheEntryImpl ) entry ;
312
+ final var standardCacheEntry = (StandardCacheEntryImpl ) entry ;
320
313
final Object [] values = standardCacheEntry .assemble (
321
314
entity ,
322
315
entityId ,
@@ -334,7 +327,7 @@ private static Object convertCacheEntryToEntity(
334
327
);
335
328
}
336
329
final Object version = getVersion ( values , subclassPersister );
337
- final EntityEntry entityEntry = persistenceContext .addEntry (
330
+ final var entityEntry = persistenceContext .addEntry (
338
331
entity ,
339
332
isReadOnly ? Status .READ_ONLY : Status .MANAGED ,
340
333
values ,
@@ -346,9 +339,7 @@ private static Object convertCacheEntryToEntity(
346
339
subclassPersister ,
347
340
false
348
341
);
349
- holder .setEntityEntry (
350
- entityEntry
351
- );
342
+ holder .setEntityEntry ( entityEntry );
352
343
subclassPersister .afterInitialize ( entity , source );
353
344
entityEntry .postLoad ( entity );
354
345
persistenceContext .initializeNonLazyCollections ();
@@ -372,43 +363,58 @@ public static boolean initializeCollectionFromCache(
372
363
CollectionPersister persister ,
373
364
PersistentCollection <?> collection ,
374
365
SharedSessionContractImplementor source ) {
375
-
376
366
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 ) {
395
369
return false ;
396
370
}
397
371
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 );
404
373
return true ;
405
374
}
406
375
}
407
376
else {
377
+ // we can't use cache here
408
378
return false ;
409
379
}
410
380
}
411
381
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
+
412
418
public record PersistenceContextEntry (Object entity , EntityStatus status ) {
413
419
public enum EntityStatus {
414
420
MANAGED ,
0 commit comments