From 55d5d680140c87d72247b75860248c425ebb09b2 Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Wed, 16 Jul 2025 13:52:02 +0200 Subject: [PATCH 1/2] Make PersistenceContextEntry#EntityStatus public for Hibernate Reactive --- .../java/org/hibernate/loader/internal/CacheLoadHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hibernate-core/src/main/java/org/hibernate/loader/internal/CacheLoadHelper.java b/hibernate-core/src/main/java/org/hibernate/loader/internal/CacheLoadHelper.java index 5fb197135030..2831ebfb5f62 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/internal/CacheLoadHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/internal/CacheLoadHelper.java @@ -410,7 +410,7 @@ public static boolean initializeCollectionFromCache( } public record PersistenceContextEntry(Object entity, EntityStatus status) { - enum EntityStatus { + public enum EntityStatus { MANAGED, REMOVED_ENTITY_MARKER, INCONSISTENT_RTN_CLASS_MARKER From e509da94c4a86e40fcb56964c42d95fd93f473d7 Mon Sep 17 00:00:00 2001 From: Davide D'Alto Date: Wed, 16 Jul 2025 17:54:11 +0200 Subject: [PATCH 2/2] CacheLoaderHelper refactoring --- .../loader/internal/CacheLoadHelper.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/loader/internal/CacheLoadHelper.java b/hibernate-core/src/main/java/org/hibernate/loader/internal/CacheLoadHelper.java index 2831ebfb5f62..07826389124b 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/internal/CacheLoadHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/internal/CacheLoadHelper.java @@ -77,32 +77,32 @@ private CacheLoadHelper() { * * @throws HibernateException Generally indicates problems applying a lock mode. */ - public static PersistenceContextEntry loadFromSessionCache( - EntityKey keyToLoad, LockOptions lockOptions, - LoadEventListener.LoadType options, - SharedSessionContractImplementor session) { + public static PersistenceContextEntry loadFromSessionCache(EntityKey keyToLoad, LockOptions lockOptions, LoadEventListener.LoadType options, SharedSessionContractImplementor session) { final Object old = session.getEntityUsingInterceptor( keyToLoad ); + PersistenceContextEntry.EntityStatus entityStatus = MANAGED; if ( old != null ) { // this object was already loaded final EntityEntry oldEntry = session.getPersistenceContext().getEntry( old ); - if ( options.isCheckDeleted() ) { - if ( oldEntry.getStatus().isDeletedOrGone() ) { - LOADING_LOGGER.foundEntityScheduledForRemoval(); - return new PersistenceContextEntry( old, REMOVED_ENTITY_MARKER ); - } - } - if ( options.isAllowNulls() ) { - final EntityPersister persister = - session.getFactory().getMappingMetamodel() - .getEntityDescriptor( keyToLoad.getEntityName() ); - if ( !persister.isInstance( old ) ) { - LOADING_LOGGER.foundEntityWrongType(); - return new PersistenceContextEntry( old, INCONSISTENT_RTN_CLASS_MARKER ); - } + entityStatus = entityStatus( keyToLoad, options, session, oldEntry, old ); + if ( entityStatus == MANAGED ) { + upgradeLock( old, oldEntry, lockOptions, session ); } - upgradeLock( old, oldEntry, lockOptions, session ); } - return new PersistenceContextEntry( old, MANAGED ); + return new PersistenceContextEntry( old, entityStatus ); + } + + // Used by Hibernate Reactive + public static PersistenceContextEntry.EntityStatus entityStatus(EntityKey keyToLoad, LoadEventListener.LoadType options, SharedSessionContractImplementor session, EntityEntry oldEntry, Object old) { + if ( options.isCheckDeleted() && oldEntry.getStatus().isDeletedOrGone() ) { + LOADING_LOGGER.foundEntityScheduledForRemoval(); + return REMOVED_ENTITY_MARKER; + } + if ( options.isAllowNulls() && !session.getFactory().getMappingMetamodel() + .getEntityDescriptor( keyToLoad.getEntityName() ).isInstance( old ) ) { + LOADING_LOGGER.foundEntityWrongType(); + return INCONSISTENT_RTN_CLASS_MARKER; + } + return MANAGED; } /**