3535import org .hibernate .internal .CoreMessageLogger ;
3636import org .hibernate .persister .entity .EntityPersister ;
3737import org .hibernate .pretty .MessageHelper ;
38- import org .hibernate .proxy .HibernateProxy ;
38+ import org .hibernate .proxy .LazyInitializer ;
3939import org .hibernate .sql .results .LoadingLogger ;
4040import org .hibernate .stat .internal .StatsHelper ;
4141import org .hibernate .stat .spi .StatisticsImplementor ;
4747import static org .hibernate .engine .internal .ManagedTypeHelper .isPersistentAttributeInterceptable ;
4848import static org .hibernate .engine .internal .Versioning .getVersion ;
4949import static org .hibernate .loader .ast .internal .LoaderHelper .upgradeLock ;
50+ import static org .hibernate .proxy .HibernateProxy .extractLazyInitializer ;
5051
5152/**
5253 * @author Vlad Mihalcea
@@ -388,7 +389,6 @@ private Object convertCacheEntryToEntity(
388389 EntityKey entityKey ) {
389390
390391 final SessionFactoryImplementor factory = source .getFactory ();
391- final EntityPersister subclassPersister ;
392392
393393 if ( LOG .isTraceEnabled () ) {
394394 LOG .tracef (
@@ -398,19 +398,20 @@ private Object convertCacheEntryToEntity(
398398 );
399399 }
400400
401- final Object entity ;
401+ final EntityPersister subclassPersister =
402+ factory .getRuntimeMetamodels ().getMappingMetamodel ()
403+ .getEntityDescriptor ( entry .getSubclass () );
404+ final PersistenceContext persistenceContext = source .getPersistenceContextInternal ();
405+ final EntityHolder oldHolder = persistenceContext .getEntityHolder ( entityKey );
402406
403- subclassPersister = factory .getRuntimeMetamodels ()
404- .getMappingMetamodel ()
405- .getEntityDescriptor ( entry .getSubclass () );
407+ final Object entity ;
406408 if ( instanceToLoad != null ) {
407409 entity = instanceToLoad ;
408410 }
409411 else {
410- final EntityHolder holder = source .getPersistenceContextInternal ().getEntityHolder ( entityKey );
411- if ( holder != null && holder .getEntity () != null ) {
412+ if ( oldHolder != null && oldHolder .getEntity () != null ) {
412413 // Use the entity which might already be
413- entity = holder .getEntity ();
414+ entity = oldHolder .getEntity ();
414415 }
415416 else {
416417 entity = source .instantiate ( subclassPersister , entityId );
@@ -430,23 +431,39 @@ private Object convertCacheEntryToEntity(
430431 }
431432
432433 // make it circular-reference safe
433- TwoPhaseLoad .addUninitializedCachedEntity (
434- entityKey ,
435- entity ,
436- subclassPersister ,
437- LockMode .NONE ,
438- entry .getVersion (),
439- source
440- );
441-
442- final PersistenceContext persistenceContext = source .getPersistenceContext ();
443- final Object [] values ;
444- final Object version ;
434+ final EntityHolder holder = persistenceContext .addEntityHolder ( entityKey , entity );
435+ final Object proxy = holder .getProxy ();
445436 final boolean isReadOnly ;
437+ if ( proxy != null ) {
438+ // there is already a proxy for this impl
439+ // only set the status to read-only if the proxy is read-only
440+ final LazyInitializer lazyInitializer = extractLazyInitializer ( proxy );
441+ assert lazyInitializer != null ;
442+ lazyInitializer .setImplementation ( entity );
443+
444+ isReadOnly = lazyInitializer .isReadOnly ();
445+ }
446+ else {
447+ isReadOnly = source .isDefaultReadOnly ();
448+ }
449+ holder .setEntityEntry (
450+ persistenceContext .addEntry (
451+ entity ,
452+ Status .LOADING ,
453+ null ,
454+ null ,
455+ entityKey .getIdentifier (),
456+ entry .getVersion (),
457+ LockMode .NONE ,
458+ true ,
459+ persister ,
460+ false
461+ )
462+ );
446463
447464 final Type [] types = subclassPersister .getPropertyTypes ();
448465 // initializes the entity by (desired) side-effect
449- values = ( (StandardCacheEntryImpl ) entry ).assemble (
466+ final Object [] values = ( (StandardCacheEntryImpl ) entry ).assemble (
450467 entity ,
451468 entityId ,
452469 subclassPersister ,
@@ -462,32 +479,23 @@ private Object convertCacheEntryToEntity(
462479 source
463480 );
464481 }
465- version = getVersion ( values , subclassPersister );
482+ final Object version = getVersion ( values , subclassPersister );
466483 LOG .tracef ( "Cached Version : %s" , version );
467484
468- final Object proxy = persistenceContext .getProxy ( entityKey );
469- if ( proxy != null ) {
470- // there is already a proxy for this impl
471- // only set the status to read-only if the proxy is read-only
472- isReadOnly = HibernateProxy .extractLazyInitializer ( proxy ).isReadOnly ();
473- }
474- else {
475- isReadOnly = source .isDefaultReadOnly ();
476- }
477-
478- EntityEntry entityEntry = persistenceContext .addEntry (
479- entity ,
480- ( isReadOnly ? Status .READ_ONLY : Status .MANAGED ),
481- values ,
482- null ,
483- entityId ,
484- version ,
485- LockMode .NONE ,
486- true ,
487- subclassPersister ,
488- false
485+ holder .setEntityEntry (
486+ persistenceContext .addEntry (
487+ entity ,
488+ isReadOnly ? Status .READ_ONLY : Status .MANAGED ,
489+ values ,
490+ null ,
491+ entityId ,
492+ version ,
493+ LockMode .NONE ,
494+ true ,
495+ subclassPersister ,
496+ false
497+ )
489498 );
490- persistenceContext .getEntityHolder ( entityKey ).setEntityEntry ( entityEntry );
491499 subclassPersister .afterInitialize ( entity , source );
492500 persistenceContext .initializeNonLazyCollections ();
493501
0 commit comments