From 1c0b0b1d031bcfa2b88897b9ccb0bdb6349bc1f5 Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Mon, 15 Sep 2025 18:16:49 +0200 Subject: [PATCH] HHH-19825 Add methods and change method access for Hibernate Reactive --- ...EnhancementAsProxyLazinessInterceptor.java | 7 +++++ .../BytecodeEnhancementMetadataPojoImpl.java | 27 ++++++++++++++++--- .../AbstractEntityInstantiatorPojo.java | 14 ++++++++++ ...ityRepresentationStrategyPojoStandard.java | 5 +++- .../tuple/entity/EntityMetamodel.java | 20 +++++++++++--- 5 files changed, 64 insertions(+), 9 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/EnhancementAsProxyLazinessInterceptor.java b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/EnhancementAsProxyLazinessInterceptor.java index 23b1030963d9..392a6f2622a9 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/EnhancementAsProxyLazinessInterceptor.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/EnhancementAsProxyLazinessInterceptor.java @@ -300,6 +300,13 @@ public boolean hasWrittenFieldNames() { return writtenFieldNames != null && !writtenFieldNames.isEmpty(); } + /* + * Used by Hibernate Reactive + */ + protected boolean isIdentifier(String attributeName) { + return meta.identifierAttributeNames.contains( attributeName ); + } + private enum Status { UNINITIALIZED, INITIALIZING, diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/internal/BytecodeEnhancementMetadataPojoImpl.java b/hibernate-core/src/main/java/org/hibernate/bytecode/internal/BytecodeEnhancementMetadataPojoImpl.java index c4926385fba7..ee468b88ceac 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/internal/BytecodeEnhancementMetadataPojoImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/internal/BytecodeEnhancementMetadataPojoImpl.java @@ -40,11 +40,11 @@ * * @author Steve Ebersole */ -public final class BytecodeEnhancementMetadataPojoImpl implements BytecodeEnhancementMetadata { +public class BytecodeEnhancementMetadataPojoImpl implements BytecodeEnhancementMetadata { /** * Static constructor */ - public static BytecodeEnhancementMetadata from( + public static BytecodeEnhancementMetadataPojoImpl from( PersistentClass persistentClass, Set identifierAttributeNames, CompositeType nonAggregatedCidMapper, @@ -75,7 +75,10 @@ public static BytecodeEnhancementMetadata from( private final LazyAttributeLoadingInterceptor.EntityRelatedState lazyAttributeLoadingInterceptorState; private volatile transient EnhancementAsProxyLazinessInterceptor.EntityRelatedState enhancementAsProxyInterceptorState; - BytecodeEnhancementMetadataPojoImpl( + /* + * Used by Hibernate Reactive + */ + protected BytecodeEnhancementMetadataPojoImpl( String entityName, Class entityClass, Set identifierAttributeNames, @@ -248,9 +251,12 @@ public void injectEnhancedEntityAsProxyInterceptor( ); } + /* + * Used by Hibernate Reactive + */ //This state object needs to be lazily initialized as it needs access to the Persister, but once //initialized it can be reused across multiple sessions. - private EnhancementAsProxyLazinessInterceptor.EntityRelatedState getEnhancementAsProxyLazinessInterceptorMetastate(SharedSessionContractImplementor session) { + public EnhancementAsProxyLazinessInterceptor.EntityRelatedState getEnhancementAsProxyLazinessInterceptorMetastate(SharedSessionContractImplementor session) { EnhancementAsProxyLazinessInterceptor.EntityRelatedState state = this.enhancementAsProxyInterceptorState; if ( state == null ) { final EntityPersister entityPersister = session.getFactory().getMappingMetamodel() @@ -311,4 +317,17 @@ public void injectInterceptor( return (BytecodeLazyAttributeInterceptor) interceptor; } + /* + * Used by Hibernate Reactive + */ + public Class getEntityClass() { + return entityClass; + } + + /* + * Used by Hibernate Reactive + */ + public LazyAttributeLoadingInterceptor.EntityRelatedState getLazyAttributeLoadingInterceptorState() { + return lazyAttributeLoadingInterceptorState; + } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractEntityInstantiatorPojo.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractEntityInstantiatorPojo.java index ed33ffb83280..3f3329580570 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractEntityInstantiatorPojo.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractEntityInstantiatorPojo.java @@ -66,4 +66,18 @@ public boolean isInstance(Object object) { // this one needed only for guessEntityMode() || proxyInterface!=null && proxyInterface.isInstance(object); } + + /* + * Used by Hibernate Reactive + */ + protected boolean isApplyBytecodeInterception() { + return applyBytecodeInterception; + } + + /* + * Used by Hibernate Reactive + */ + protected LazyAttributeLoadingInterceptor.EntityRelatedState getLoadingInterceptorState() { + return loadingInterceptorState; + } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java index 0284d4137c5e..719d616b588c 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java @@ -163,7 +163,10 @@ private Map buildPropertyAccessMap(PersistentClass bootD return propertyAccessMap; } - private EntityInstantiator determineInstantiator(PersistentClass bootDescriptor, EntityMetamodel entityMetamodel) { + /* + * Used by Hibernate Reactive + */ + protected EntityInstantiator determineInstantiator(PersistentClass bootDescriptor, EntityMetamodel entityMetamodel) { if ( reflectionOptimizer != null && reflectionOptimizer.getInstantiationOptimizer() != null ) { return new EntityInstantiatorPojoOptimized( entityMetamodel, diff --git a/hibernate-core/src/main/java/org/hibernate/tuple/entity/EntityMetamodel.java b/hibernate-core/src/main/java/org/hibernate/tuple/entity/EntityMetamodel.java index 29aafc2ef259..ee8a7ddd5131 100644 --- a/hibernate-core/src/main/java/org/hibernate/tuple/entity/EntityMetamodel.java +++ b/hibernate-core/src/main/java/org/hibernate/tuple/entity/EntityMetamodel.java @@ -205,13 +205,12 @@ public EntityMetamodel( idAttributeNames = singleton( identifierAttribute.getName() ); } - bytecodeEnhancementMetadata = BytecodeEnhancementMetadataPojoImpl.from( + bytecodeEnhancementMetadata = getBytecodeEnhancementMetadataPojo( persistentClass, + creationContext, idAttributeNames, nonAggregatedCidMapper, - collectionsInDefaultFetchGroupEnabled, - creationContext.getMetadata() - ); + collectionsInDefaultFetchGroupEnabled ); } else { bytecodeEnhancementMetadata = new BytecodeEnhancementMetadataNonPojoImpl( persistentClass.getEntityName() ); @@ -512,6 +511,19 @@ && isAbstractClass( persistentClass.getMappedClass() ) ) { // entityNameByInheritanceClassMap = toSmallMap( entityNameByInheritanceClassMapLocal ); } + /* + * Used by Hibernate Reactive + */ + protected BytecodeEnhancementMetadata getBytecodeEnhancementMetadataPojo(PersistentClass persistentClass, RuntimeModelCreationContext creationContext, Set idAttributeNames, CompositeType nonAggregatedCidMapper, boolean collectionsInDefaultFetchGroupEnabled) { + return BytecodeEnhancementMetadataPojoImpl.from( + persistentClass, + idAttributeNames, + nonAggregatedCidMapper, + collectionsInDefaultFetchGroupEnabled, + creationContext.getMetadata() + ); + } + private static boolean writePropertyValue(OnExecutionGenerator generator) { final boolean writePropertyValue = generator.writePropertyValue(); // TODO: move this validation somewhere else!