31
31
import org .hibernate .internal .CoreMessageLogger ;
32
32
import org .hibernate .persister .entity .EntityPersister ;
33
33
import org .hibernate .pretty .MessageHelper ;
34
+ import org .hibernate .proxy .LazyInitializer ;
34
35
import org .hibernate .sql .results .LoadingLogger ;
35
36
import org .hibernate .stat .internal .StatsHelper ;
36
37
import org .hibernate .stat .spi .StatisticsImplementor ;
@@ -377,16 +378,17 @@ private Object convertCacheEntryToEntity(
377
378
final EntityPersister subclassPersister =
378
379
factory .getRuntimeMetamodels ().getMappingMetamodel ()
379
380
.getEntityDescriptor ( entry .getSubclass () );
381
+ final PersistenceContext persistenceContext = source .getPersistenceContextInternal ();
382
+ final EntityHolder oldHolder = persistenceContext .getEntityHolder ( entityKey );
380
383
381
384
final Object entity ;
382
385
if ( instanceToLoad != null ) {
383
386
entity = instanceToLoad ;
384
387
}
385
388
else {
386
- final EntityHolder holder = source .getPersistenceContextInternal ().getEntityHolder ( entityKey );
387
- if ( holder != null && holder .getEntity () != null ) {
389
+ if ( oldHolder != null && oldHolder .getEntity () != null ) {
388
390
// Use the entity which might already be
389
- entity = holder .getEntity ();
391
+ entity = oldHolder .getEntity ();
390
392
}
391
393
else {
392
394
entity = source .instantiate ( subclassPersister , entityId );
@@ -407,13 +409,34 @@ private Object convertCacheEntryToEntity(
407
409
}
408
410
409
411
// make it circular-reference safe
410
- TwoPhaseLoad .addUninitializedCachedEntity (
411
- entityKey ,
412
- entity ,
413
- subclassPersister ,
414
- LockMode .NONE ,
415
- entry .getVersion (),
416
- source
412
+ final EntityHolder holder = persistenceContext .addEntityHolder ( entityKey , entity );
413
+ final Object proxy = holder .getProxy ();
414
+ final boolean isReadOnly ;
415
+ if ( proxy != null ) {
416
+ // there is already a proxy for this impl
417
+ // only set the status to read-only if the proxy is read-only
418
+ final LazyInitializer lazyInitializer = extractLazyInitializer ( proxy );
419
+ assert lazyInitializer != null ;
420
+ lazyInitializer .setImplementation ( entity );
421
+
422
+ isReadOnly = lazyInitializer .isReadOnly ();
423
+ }
424
+ else {
425
+ isReadOnly = source .isDefaultReadOnly ();
426
+ }
427
+ holder .setEntityEntry (
428
+ persistenceContext .addEntry (
429
+ entity ,
430
+ Status .LOADING ,
431
+ null ,
432
+ null ,
433
+ entityKey .getIdentifier (),
434
+ entry .getVersion (),
435
+ LockMode .NONE ,
436
+ true ,
437
+ persister ,
438
+ false
439
+ )
417
440
);
418
441
419
442
final Type [] types = subclassPersister .getPropertyTypes ();
@@ -438,32 +461,20 @@ private Object convertCacheEntryToEntity(
438
461
final Object version = getVersion ( values , subclassPersister );
439
462
LOG .tracef ( "Cached Version : %s" , version );
440
463
441
- final PersistenceContext persistenceContext = source .getPersistenceContext ();
442
-
443
- final Object proxy = persistenceContext .getProxy ( entityKey );
444
- final boolean isReadOnly ;
445
- if ( proxy != null ) {
446
- // there is already a proxy for this impl
447
- // only set the status to read-only if the proxy is read-only
448
- isReadOnly = extractLazyInitializer ( proxy ).isReadOnly ();
449
- }
450
- else {
451
- isReadOnly = source .isDefaultReadOnly ();
452
- }
453
-
454
- final EntityEntry entityEntry = persistenceContext .addEntry (
455
- entity ,
456
- isReadOnly ? Status .READ_ONLY : Status .MANAGED ,
457
- values ,
458
- null ,
459
- entityId ,
460
- version ,
461
- LockMode .NONE ,
462
- true ,
463
- subclassPersister ,
464
- false
464
+ holder .setEntityEntry (
465
+ persistenceContext .addEntry (
466
+ entity ,
467
+ isReadOnly ? Status .READ_ONLY : Status .MANAGED ,
468
+ values ,
469
+ null ,
470
+ entityId ,
471
+ version ,
472
+ LockMode .NONE ,
473
+ true ,
474
+ subclassPersister ,
475
+ false
476
+ )
465
477
);
466
- persistenceContext .getEntityHolder ( entityKey ).setEntityEntry ( entityEntry );
467
478
subclassPersister .afterInitialize ( entity , source );
468
479
persistenceContext .initializeNonLazyCollections ();
469
480
0 commit comments