From b2d360607cd877bb603a195b5fc13e2867c1e4eb Mon Sep 17 00:00:00 2001 From: Gavin King Date: Mon, 17 Nov 2025 17:33:38 +0100 Subject: [PATCH 1/4] tidy up org.hibernate.internal - make some things package-private - move some stuff out to where it's used --- .../internal/SessionFactoryBuilderImpl.java | 127 +++++++++--------- .../spi/interceptor/EnhancementHelper.java | 11 +- .../SessionCreationOptionsAdaptor.java | 6 +- .../engine/internal/PersistenceContexts.java | 4 +- .../internal/StatefulPersistenceContext.java | 5 +- .../engine/spi/FilterDefinition.java | 2 +- .../transaction/internal/TransactionImpl.java | 6 +- .../AbstractSharedSessionContract.java | 4 +- .../ContextualJdbcConnectionAccess.java | 4 +- .../internal/SessionFactoryImpl.java | 4 +- .../internal/SessionFactoryObserverChain.java | 4 +- .../internal/SessionFactoryRegistry.java | 13 ++ .../org/hibernate/internal/SessionImpl.java | 4 +- .../internal/StatelessSessionImpl.java | 4 +- .../AbstractScrollableResults.java | 2 +- .../EmptyScrollableResults.java | 2 +- .../FetchingScrollableResultsImpl.java | 2 +- .../ScrollableResultsImpl.java | 2 +- .../org/hibernate/mapping/Collection.java | 1 - .../FilterConfiguration.java | 3 +- .../org/hibernate/mapping/Filterable.java | 9 +- .../hibernate/mapping/PersistentClass.java | 1 - .../java/org/hibernate/mapping/Subclass.java | 3 +- .../filter/internal/FilterHelper.java | 41 +++--- .../internal/NativeSelectQueryPlanImpl.java | 2 +- .../AggregatedSelectQueryPlanImpl.java | 2 +- .../internal/ConcreteSqmSelectQueryPlan.java | 2 +- .../sql/ast/spi/AbstractSqlAstTranslator.java | 1 - .../ast/spi}/FilterJdbcParameter.java | 6 +- .../ast/tree/predicate/FilterPredicate.java | 61 +++++---- .../spi/ScrollableResultsConsumer.java | 4 +- .../test/batch/EmbeddableBatchingTest.java | 6 +- .../jpa/EntityManagerFactoryUnwrapTest.java | 5 +- .../orm/test/jpa/lock/QueryLockingTest.java | 6 +- ...ntityManagerWithActiveTransactionTest.java | 5 +- .../TransactionJoinHandlingChecker.java | 4 +- .../transaction/TransactionJoiningTest.java | 4 +- .../test/lazyload/LazyLoadingLoggingTest.java | 4 +- .../cached/CachedMutableNaturalIdTest.java | 8 +- ...nnectionProviderFromBeanContainerTest.java | 6 +- .../hibernate/orm/test/proxy/ProxyTest.java | 8 +- .../SessionWithSharedConnectionTest.java | 5 +- .../org/hibernate/orm/test/type/TypeTest.java | 4 +- .../testing/logger/LoggingRuleTest.java | 5 +- 44 files changed, 207 insertions(+), 205 deletions(-) rename hibernate-core/src/main/java/org/hibernate/internal/{ => scrollable}/AbstractScrollableResults.java (98%) rename hibernate-core/src/main/java/org/hibernate/internal/{ => scrollable}/EmptyScrollableResults.java (97%) rename hibernate-core/src/main/java/org/hibernate/internal/{ => scrollable}/FetchingScrollableResultsImpl.java (99%) rename hibernate-core/src/main/java/org/hibernate/internal/{ => scrollable}/ScrollableResultsImpl.java (98%) rename hibernate-core/src/main/java/org/hibernate/{internal => mapping}/FilterConfiguration.java (96%) rename hibernate-core/src/main/java/org/hibernate/{internal => sql/ast/spi}/FilterJdbcParameter.java (88%) diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java index d76cbf40f42c..b187819a79a3 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java @@ -23,7 +23,6 @@ import org.hibernate.cache.spi.TimestampsCacheFactory; import org.hibernate.context.spi.CurrentTenantIdentifierResolver; import org.hibernate.context.spi.TenantSchemaMapper; -import org.hibernate.internal.SessionFactoryImpl; import org.hibernate.proxy.EntityNotFoundDelegate; import org.hibernate.query.sqm.function.SqmFunctionDescriptor; import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode; @@ -32,6 +31,8 @@ import jakarta.persistence.criteria.Nulls; +import static org.hibernate.internal.SessionFactoryRegistry.instantiateSessionFactory; + /** * @author Gail Badner * @author Steve Ebersole @@ -63,7 +64,7 @@ public SessionFactoryBuilderImpl(MetadataImplementor metadata, SessionFactoryOpt } } - final BytecodeProvider bytecodeProvider = + final var bytecodeProvider = metadata.getMetadataBuildingOptions().getServiceRegistry() .getService( BytecodeProvider.class ); addSessionFactoryObservers( new SessionFactoryObserverForBytecodeEnhancer( bytecodeProvider ) ); @@ -74,366 +75,366 @@ public SessionFactoryBuilderImpl(MetadataImplementor metadata, SessionFactoryOpt @Override public SessionFactoryBuilder applyBeanManager(Object beanManager) { - this.optionsBuilder.applyBeanManager( beanManager ); + optionsBuilder.applyBeanManager( beanManager ); return this; } @Override public SessionFactoryBuilder applyValidatorFactory(Object validatorFactory) { - this.optionsBuilder.applyValidatorFactory( validatorFactory ); + optionsBuilder.applyValidatorFactory( validatorFactory ); return this; } @Override public SessionFactoryBuilder applyName(String sessionFactoryName) { - this.optionsBuilder.applySessionFactoryName( sessionFactoryName ); + optionsBuilder.applySessionFactoryName( sessionFactoryName ); return this; } @Override public SessionFactoryBuilder applyNameAsJndiName(boolean isJndiName) { - this.optionsBuilder.enableSessionFactoryNameAsJndiName( isJndiName ); + optionsBuilder.enableSessionFactoryNameAsJndiName( isJndiName ); return this; } @Override public SessionFactoryBuilder applyAutoClosing(boolean enabled) { - this.optionsBuilder.enableSessionAutoClosing( enabled ); + optionsBuilder.enableSessionAutoClosing( enabled ); return this; } @Override public SessionFactoryBuilder applyAutoFlushing(boolean enabled) { - this.optionsBuilder.enableSessionAutoFlushing( enabled ); + optionsBuilder.enableSessionAutoFlushing( enabled ); return this; } @Override public SessionFactoryBuilder applyJtaTrackingByThread(boolean enabled) { - this.optionsBuilder.enableJtaTrackingByThread( enabled ); + optionsBuilder.enableJtaTrackingByThread( enabled ); return this; } @Override public SessionFactoryBuilder applyPreferUserTransactions(boolean preferUserTransactions) { - this.optionsBuilder.enablePreferUserTransaction( preferUserTransactions ); + optionsBuilder.enablePreferUserTransaction( preferUserTransactions ); return this; } @Override public SessionFactoryBuilder applyStatisticsSupport(boolean enabled) { - this.optionsBuilder.enableStatisticsSupport( enabled ); + optionsBuilder.enableStatisticsSupport( enabled ); return this; } @Override public SessionFactoryBuilder addSessionFactoryObservers(SessionFactoryObserver... observers) { - this.optionsBuilder.addSessionFactoryObservers( observers ); + optionsBuilder.addSessionFactoryObservers( observers ); return this; } @Override public SessionFactoryBuilder applyInterceptor(Interceptor interceptor) { - this.optionsBuilder.applyInterceptor( interceptor ); + optionsBuilder.applyInterceptor( interceptor ); return this; } @Override public SessionFactoryBuilder applyStatelessInterceptor(Class statelessInterceptorClass) { - this.optionsBuilder.applyStatelessInterceptor( statelessInterceptorClass ); + optionsBuilder.applyStatelessInterceptor( statelessInterceptorClass ); return this; } @Override public SessionFactoryBuilder applyStatelessInterceptor(Supplier statelessInterceptorSupplier) { - this.optionsBuilder.applyStatelessInterceptorSupplier( statelessInterceptorSupplier ); + optionsBuilder.applyStatelessInterceptorSupplier( statelessInterceptorSupplier ); return this; } @Override public SessionFactoryBuilder applyStatementInspector(StatementInspector statementInspector) { - this.optionsBuilder.applyStatementInspector( statementInspector ); + optionsBuilder.applyStatementInspector( statementInspector ); return this; } @Override public SessionFactoryBuilder applyCustomEntityDirtinessStrategy(CustomEntityDirtinessStrategy strategy) { - this.optionsBuilder.applyCustomEntityDirtinessStrategy( strategy ); + optionsBuilder.applyCustomEntityDirtinessStrategy( strategy ); return this; } @Override public SessionFactoryBuilder addEntityNameResolver(EntityNameResolver... entityNameResolvers) { - this.optionsBuilder.addEntityNameResolvers( entityNameResolvers ); + optionsBuilder.addEntityNameResolvers( entityNameResolvers ); return this; } @Override public SessionFactoryBuilder applyEntityNotFoundDelegate(EntityNotFoundDelegate entityNotFoundDelegate) { - this.optionsBuilder.applyEntityNotFoundDelegate( entityNotFoundDelegate ); + optionsBuilder.applyEntityNotFoundDelegate( entityNotFoundDelegate ); return this; } @Override public SessionFactoryBuilder applyIdentifierRollbackSupport(boolean enabled) { - this.optionsBuilder.enableIdentifierRollbackSupport( enabled ); + optionsBuilder.enableIdentifierRollbackSupport( enabled ); return this; } @Override public SessionFactoryBuilder applyNullabilityChecking(boolean enabled) { - this.optionsBuilder.enableNullabilityChecking( enabled ); + optionsBuilder.enableNullabilityChecking( enabled ); return this; } @Override public SessionFactoryBuilder applyLazyInitializationOutsideTransaction(boolean enabled) { - this.optionsBuilder.allowLazyInitializationOutsideTransaction( enabled ); + optionsBuilder.allowLazyInitializationOutsideTransaction( enabled ); return this; } @Override @Deprecated public SessionFactoryBuilder applyTempTableDdlTransactionHandling(TempTableDdlTransactionHandling handling) { - this.optionsBuilder.applyTempTableDdlTransactionHandling( handling ); + optionsBuilder.applyTempTableDdlTransactionHandling( handling ); return this; } @Override public SessionFactoryBuilder applyDelayedEntityLoaderCreations(boolean delay) { - this.optionsBuilder.applyDelayedEntityLoaderCreations( delay ); + optionsBuilder.applyDelayedEntityLoaderCreations( delay ); return this; } @Override public SessionFactoryBuilder applyDefaultBatchFetchSize(int size) { - this.optionsBuilder.applyDefaultBatchFetchSize( size ); + optionsBuilder.applyDefaultBatchFetchSize( size ); return this; } @Override public SessionFactoryBuilder applyMaximumFetchDepth(int depth) { - this.optionsBuilder.applyMaximumFetchDepth( depth ); + optionsBuilder.applyMaximumFetchDepth( depth ); return this; } @Override public SessionFactoryBuilder applySubselectFetchEnabled(boolean enabled) { - this.optionsBuilder.applySubselectFetchEnabled( enabled ); + optionsBuilder.applySubselectFetchEnabled( enabled ); return this; } @Override public SessionFactoryBuilder applyDefaultNullPrecedence(Nulls nullPrecedence) { - this.optionsBuilder.applyDefaultNullPrecedence( nullPrecedence ); + optionsBuilder.applyDefaultNullPrecedence( nullPrecedence ); return this; } @Override public SessionFactoryBuilder applyOrderingOfInserts(boolean enabled) { - this.optionsBuilder.enableOrderingOfInserts( enabled ); + optionsBuilder.enableOrderingOfInserts( enabled ); return this; } @Override public SessionFactoryBuilder applyOrderingOfUpdates(boolean enabled) { - this.optionsBuilder.enableOrderingOfUpdates( enabled ); + optionsBuilder.enableOrderingOfUpdates( enabled ); return this; } @Override public SessionFactoryBuilder applyMultiTenancy(boolean enabled) { - this.optionsBuilder.applyMultiTenancy(enabled); + optionsBuilder.applyMultiTenancy(enabled); return this; } @Override public SessionFactoryBuilder applyCurrentTenantIdentifierResolver(CurrentTenantIdentifierResolver resolver) { - this.optionsBuilder.applyCurrentTenantIdentifierResolver( resolver ); + optionsBuilder.applyCurrentTenantIdentifierResolver( resolver ); return this; } @Override public SessionFactoryBuilder applyTenantSchemaMapper(TenantSchemaMapper mapper) { - this.optionsBuilder.applyTenantSchemaMapper( mapper ); + optionsBuilder.applyTenantSchemaMapper( mapper ); return this; } @Override public SessionFactoryBuilder applyNamedQueryCheckingOnStartup(boolean enabled) { - this.optionsBuilder.enableNamedQueryCheckingOnStartup( enabled ); + optionsBuilder.enableNamedQueryCheckingOnStartup( enabled ); return this; } @Override public SessionFactoryBuilder applySecondLevelCacheSupport(boolean enabled) { - this.optionsBuilder.enableSecondLevelCacheSupport( enabled ); + optionsBuilder.enableSecondLevelCacheSupport( enabled ); return this; } @Override public SessionFactoryBuilder applyQueryCacheSupport(boolean enabled) { - this.optionsBuilder.enableQueryCacheSupport( enabled ); + optionsBuilder.enableQueryCacheSupport( enabled ); return this; } @Override public SessionFactoryBuilder applyQueryCacheLayout(CacheLayout cacheLayout) { - this.optionsBuilder.applyQueryCacheLayout( cacheLayout ); + optionsBuilder.applyQueryCacheLayout( cacheLayout ); return this; } @Override public SessionFactoryBuilder applyTimestampsCacheFactory(TimestampsCacheFactory factory) { - this.optionsBuilder.applyTimestampsCacheFactory( factory ); + optionsBuilder.applyTimestampsCacheFactory( factory ); return this; } @Override public SessionFactoryBuilder applyCacheRegionPrefix(String prefix) { - this.optionsBuilder.applyCacheRegionPrefix( prefix ); + optionsBuilder.applyCacheRegionPrefix( prefix ); return this; } @Override public SessionFactoryBuilder applyMinimalPutsForCaching(boolean enabled) { - this.optionsBuilder.enableMinimalPuts( enabled ); + optionsBuilder.enableMinimalPuts( enabled ); return this; } @Override public SessionFactoryBuilder applyStructuredCacheEntries(boolean enabled) { - this.optionsBuilder.enabledStructuredCacheEntries( enabled ); + optionsBuilder.enabledStructuredCacheEntries( enabled ); return this; } @Override public SessionFactoryBuilder applyDirectReferenceCaching(boolean enabled) { - this.optionsBuilder.allowDirectReferenceCacheEntries( enabled ); + optionsBuilder.allowDirectReferenceCacheEntries( enabled ); return this; } @Override public SessionFactoryBuilder applyAutomaticEvictionOfCollectionCaches(boolean enabled) { - this.optionsBuilder.enableAutoEvictCollectionCaches( enabled ); + optionsBuilder.enableAutoEvictCollectionCaches( enabled ); return this; } @Override public SessionFactoryBuilder applyJdbcBatchSize(int size) { - this.optionsBuilder.applyJdbcBatchSize( size ); + optionsBuilder.applyJdbcBatchSize( size ); return this; } @Override public SessionFactoryBuilder applyScrollableResultsSupport(boolean enabled) { - this.optionsBuilder.enableScrollableResultSupport( enabled ); + optionsBuilder.enableScrollableResultSupport( enabled ); return this; } @Override public SessionFactoryBuilder applyGetGeneratedKeysSupport(boolean enabled) { - this.optionsBuilder.enableGeneratedKeysSupport( enabled ); + optionsBuilder.enableGeneratedKeysSupport( enabled ); return this; } @Override public SessionFactoryBuilder applyJdbcFetchSize(int size) { - this.optionsBuilder.applyJdbcFetchSize( size ); + optionsBuilder.applyJdbcFetchSize( size ); return this; } @Override public SessionFactoryBuilder applyConnectionHandlingMode(PhysicalConnectionHandlingMode connectionHandlingMode) { - this.optionsBuilder.applyConnectionHandlingMode( connectionHandlingMode ); + optionsBuilder.applyConnectionHandlingMode( connectionHandlingMode ); return this; } @Override public SessionFactoryBuilder applyConnectionProviderDisablesAutoCommit(boolean providerDisablesAutoCommit) { - this.optionsBuilder.applyConnectionProviderDisablesAutoCommit( providerDisablesAutoCommit ); + optionsBuilder.applyConnectionProviderDisablesAutoCommit( providerDisablesAutoCommit ); return this; } @Override public SessionFactoryBuilder applySqlComments(boolean enabled) { - this.optionsBuilder.enableCommentsSupport( enabled ); + optionsBuilder.enableCommentsSupport( enabled ); return this; } @Override public SessionFactoryBuilder applySqlFunction(String registrationName, SqmFunctionDescriptor functionDescriptor) { - this.optionsBuilder.applySqlFunction( registrationName, functionDescriptor ); + optionsBuilder.applySqlFunction( registrationName, functionDescriptor ); return this; } @Override public SessionFactoryBuilder applyCollectionsInDefaultFetchGroup(boolean enabled) { - this.optionsBuilder.enableCollectionInDefaultFetchGroup( enabled ); + optionsBuilder.enableCollectionInDefaultFetchGroup( enabled ); return this; } @Override public SessionFactoryBuilder allowOutOfTransactionUpdateOperations(boolean allow) { - this.optionsBuilder.allowOutOfTransactionUpdateOperations( allow ); + optionsBuilder.allowOutOfTransactionUpdateOperations( allow ); return this; } @Override @Deprecated public SessionFactoryBuilder enableReleaseResourcesOnCloseEnabled(boolean enable) { - this.optionsBuilder.enableReleaseResourcesOnClose( enable ); + optionsBuilder.enableReleaseResourcesOnClose( enable ); return this; } @Override public SessionFactoryBuilder enableJpaQueryCompliance(boolean enabled) { - this.optionsBuilder.enableJpaQueryCompliance( enabled ); + optionsBuilder.enableJpaQueryCompliance( enabled ); return this; } @Override public SessionFactoryBuilder enableJpaOrderByMappingCompliance(boolean enabled) { - this.optionsBuilder.enableJpaOrderByMappingCompliance( enabled ); + optionsBuilder.enableJpaOrderByMappingCompliance( enabled ); return this; } @Override public SessionFactoryBuilder enableJpaTransactionCompliance(boolean enabled) { - this.optionsBuilder.enableJpaTransactionCompliance( enabled ); + optionsBuilder.enableJpaTransactionCompliance( enabled ); return this; } @Override @Deprecated public SessionFactoryBuilder enableJpaCascadeCompliance(boolean enabled) { - this.optionsBuilder.enableJpaCascadeCompliance( enabled ); + optionsBuilder.enableJpaCascadeCompliance( enabled ); return this; } @Override public SessionFactoryBuilder enableJpaClosedCompliance(boolean enabled) { - this.optionsBuilder.enableJpaClosedCompliance( enabled ); + optionsBuilder.enableJpaClosedCompliance( enabled ); return this; } @Override public SessionFactoryBuilder applyJsonFormatMapper(FormatMapper jsonFormatMapper) { - this.optionsBuilder.applyJsonFormatMapper( jsonFormatMapper ); + optionsBuilder.applyJsonFormatMapper( jsonFormatMapper ); return this; } @Override public SessionFactoryBuilder applyXmlFormatMapper(FormatMapper xmlFormatMapper) { - this.optionsBuilder.applyXmlFormatMapper( xmlFormatMapper ); + optionsBuilder.applyXmlFormatMapper( xmlFormatMapper ); return this; } @Override public void disableJtaTransactionAccess() { - this.optionsBuilder.disableJtaTransactionAccess(); + optionsBuilder.disableJtaTransactionAccess(); } @Override public SessionFactory build() { - return new SessionFactoryImpl( metadata, buildSessionFactoryOptions(), bootstrapContext ); + return instantiateSessionFactory( metadata, buildSessionFactoryOptions(), bootstrapContext ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/EnhancementHelper.java b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/EnhancementHelper.java index 9391bd4f6d0f..5baf960bf21a 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/EnhancementHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/EnhancementHelper.java @@ -9,15 +9,12 @@ import org.hibernate.FlushMode; import org.hibernate.LazyInitializationException; -import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.SessionFactoryRegistry; import org.hibernate.mapping.Collection; import org.hibernate.mapping.ManyToOne; import org.hibernate.mapping.Property; import org.hibernate.mapping.ToOne; -import org.hibernate.mapping.Value; import static org.hibernate.bytecode.enhance.spi.interceptor.BytecodeInterceptorLogging.BYTECODE_INTERCEPTOR_LOGGER; @@ -39,7 +36,7 @@ public static boolean includeInBaseFetchGroup( boolean isEnhanced, InheritanceChecker inheritanceChecker, boolean collectionsInDefaultFetchGroupEnabled) { - final Value value = bootMapping.getValue(); + final var value = bootMapping.getValue(); if ( ! isEnhanced ) { if ( value instanceof ToOne toOne ) { @@ -62,7 +59,7 @@ public static boolean includeInBaseFetchGroup( if ( value instanceof ToOne toOne ) { if ( ! toOne.isLazy() ) { - // its not lazy... select it + // it's not lazy... select it return true; } @@ -273,8 +270,8 @@ private static SharedSessionContractImplementor openTemporarySessionForLoading( throw createLazyInitializationException( Cause.NO_SF_UUID, entityName, attributeName ); } - final SessionFactoryImplementor sf = SessionFactoryRegistry.INSTANCE.getSessionFactory( interceptor.getSessionFactoryUuid() ); - final SessionImplementor session = sf.openSession(); + final var factory = SessionFactoryRegistry.INSTANCE.getSessionFactory( interceptor.getSessionFactoryUuid() ); + final var session = factory.openSession(); session.getPersistenceContextInternal().setDefaultReadOnly( true ); session.setHibernateFlushMode( FlushMode.MANUAL ); return session; diff --git a/hibernate-core/src/main/java/org/hibernate/engine/creation/internal/SessionCreationOptionsAdaptor.java b/hibernate-core/src/main/java/org/hibernate/engine/creation/internal/SessionCreationOptionsAdaptor.java index 1b6995be6b63..2235305d3053 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/creation/internal/SessionCreationOptionsAdaptor.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/creation/internal/SessionCreationOptionsAdaptor.java @@ -11,8 +11,8 @@ import org.hibernate.Transaction; import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.engine.spi.TransactionCompletionCallbacksImplementor; -import org.hibernate.internal.AbstractSharedSessionContract; import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode; import org.hibernate.resource.jdbc.spi.StatementInspector; import org.hibernate.resource.transaction.spi.TransactionCoordinator; @@ -24,7 +24,7 @@ /** * Wraps a {@link CommonSharedSessionCreationOptions} as a * {@link SharedSessionCreationOptions} to pass to - * {@link org.hibernate.internal.AbstractSharedSessionContract} + * {@code org.hibernate.internal.AbstractSharedSessionContract} * during construction. * * @param factory The {@code SessionFactoryImplementor} @@ -33,7 +33,7 @@ public record SessionCreationOptionsAdaptor( SessionFactoryImplementor factory, CommonSharedSessionCreationOptions options, - AbstractSharedSessionContract originalSession) + SharedSessionContractImplementor originalSession) implements SharedSessionCreationOptions { @Override diff --git a/hibernate-core/src/main/java/org/hibernate/engine/internal/PersistenceContexts.java b/hibernate-core/src/main/java/org/hibernate/engine/internal/PersistenceContexts.java index 4b831e6b4dfe..980e29ab0013 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/internal/PersistenceContexts.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/internal/PersistenceContexts.java @@ -5,8 +5,8 @@ package org.hibernate.engine.internal; import org.hibernate.engine.spi.PersistenceContext; +import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.internal.SessionImpl; import java.io.IOException; import java.io.ObjectInputStream; @@ -23,7 +23,7 @@ public static PersistenceContext createPersistenceContext(SharedSessionContractI return new StatefulPersistenceContext( session ); } - public static PersistenceContext deserialize(ObjectInputStream ois, SessionImpl session) + public static PersistenceContext deserialize(ObjectInputStream ois, SessionImplementor session) throws IOException, ClassNotFoundException { return StatefulPersistenceContext.deserialize( ois, session ); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/internal/StatefulPersistenceContext.java b/hibernate-core/src/main/java/org/hibernate/engine/internal/StatefulPersistenceContext.java index 6b6ce4105c80..1470d7afd928 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/internal/StatefulPersistenceContext.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/internal/StatefulPersistenceContext.java @@ -1881,9 +1881,8 @@ private void writeCollectionToStream( * @throws IOException deserialization errors. * @throws ClassNotFoundException deserialization errors. */ - public static StatefulPersistenceContext deserialize( - ObjectInputStream ois, - SessionImplementor session) throws IOException, ClassNotFoundException { + public static StatefulPersistenceContext deserialize(ObjectInputStream ois, SessionImplementor session) + throws IOException, ClassNotFoundException { PERSISTENCE_CONTEXT_LOGGER.deserializingPersistenceContext(); final var context = new StatefulPersistenceContext( session ); final var factory = session.getFactory(); diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/FilterDefinition.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/FilterDefinition.java index 012f2d298095..2ba440f2dbaa 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/FilterDefinition.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/FilterDefinition.java @@ -97,7 +97,7 @@ public Set getParameterNames() { } public @Nullable Supplier getParameterResolver(String parameterName) { - final ManagedBean> resolver = parameterResolverMap.get( parameterName ); + final var resolver = parameterResolverMap.get( parameterName ); return resolver == null ? null : resolver.getBeanInstance(); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/transaction/internal/TransactionImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/transaction/internal/TransactionImpl.java index 4a165607323d..f1c0ecb92b1d 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/transaction/internal/TransactionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/transaction/internal/TransactionImpl.java @@ -8,8 +8,8 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.TransactionException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.engine.transaction.spi.TransactionImplementor; -import org.hibernate.internal.AbstractSharedSessionContract; import org.hibernate.resource.transaction.spi.TransactionCoordinator; import org.hibernate.resource.transaction.spi.TransactionStatus; @@ -24,13 +24,13 @@ public class TransactionImpl implements TransactionImplementor { private final TransactionCoordinator transactionCoordinator; private final boolean jpaCompliance; - private final AbstractSharedSessionContract session; + private final SharedSessionContractImplementor session; private TransactionDriver transactionDriverControl; public TransactionImpl( TransactionCoordinator transactionCoordinator, - AbstractSharedSessionContract session) { + SharedSessionContractImplementor session) { this.transactionCoordinator = transactionCoordinator; this.session = session; diff --git a/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java b/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java index b75a28a1c0c2..2474372bc614 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java @@ -139,7 +139,7 @@ * * @author Steve Ebersole */ -public abstract class AbstractSharedSessionContract implements SharedSessionContractImplementor { +abstract class AbstractSharedSessionContract implements SharedSessionContractImplementor { private transient SessionFactoryImpl factory; private transient SessionFactoryOptions factoryOptions; @@ -186,7 +186,7 @@ public abstract class AbstractSharedSessionContract implements SharedSessionCont private transient ExceptionConverter exceptionConverter; private transient SessionAssociationMarkers sessionAssociationMarkers; - public AbstractSharedSessionContract(SessionFactoryImpl factory, SessionCreationOptions options) { + AbstractSharedSessionContract(SessionFactoryImpl factory, SessionCreationOptions options) { this.factory = factory; factoryOptions = factory.getSessionFactoryOptions(); diff --git a/hibernate-core/src/main/java/org/hibernate/internal/ContextualJdbcConnectionAccess.java b/hibernate-core/src/main/java/org/hibernate/internal/ContextualJdbcConnectionAccess.java index d1940a42409b..2118f39ba3d5 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/ContextualJdbcConnectionAccess.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/ContextualJdbcConnectionAccess.java @@ -17,7 +17,7 @@ /** * @author Steve Ebersole */ -public class ContextualJdbcConnectionAccess implements JdbcConnectionAccess, Serializable { +class ContextualJdbcConnectionAccess implements JdbcConnectionAccess, Serializable { private final Object tenantIdentifier; private final boolean readOnly; private final SessionEventListener listener; @@ -25,7 +25,7 @@ public class ContextualJdbcConnectionAccess implements JdbcConnectionAccess, Ser private final SharedSessionContractImplementor session; - public ContextualJdbcConnectionAccess( + ContextualJdbcConnectionAccess( Object tenantIdentifier, boolean readOnly, SessionEventListener listener, diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java index 6dc2d168d8cc..1669f84d5f0b 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java @@ -153,7 +153,7 @@ * @author Steve Ebersole * @author Chris Cranford */ -public class SessionFactoryImpl implements SessionFactoryImplementor { +class SessionFactoryImpl implements SessionFactoryImplementor { private final String name; private final String jndiName; @@ -205,7 +205,7 @@ public class SessionFactoryImpl implements SessionFactoryImplementor { final transient ParameterMarkerStrategy parameterMarkerStrategy; final transient JdbcValuesMappingProducerProvider jdbcValuesMappingProducerProvider; - public SessionFactoryImpl( + SessionFactoryImpl( final MetadataImplementor bootMetamodel, final SessionFactoryOptions options, final BootstrapContext bootstrapContext) { diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryObserverChain.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryObserverChain.java index 4a2936a115be..1214e0e245cc 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryObserverChain.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryObserverChain.java @@ -13,10 +13,10 @@ /** * @author Steve Ebersole */ -public class SessionFactoryObserverChain implements SessionFactoryObserver { +class SessionFactoryObserverChain implements SessionFactoryObserver { private List observers; - public void addObserver(SessionFactoryObserver observer) { + void addObserver(SessionFactoryObserver observer) { if ( observers == null ) { observers = new ArrayList<>(); } diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryRegistry.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryRegistry.java index 5513775cb218..7a43b3239dea 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryRegistry.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryRegistry.java @@ -15,6 +15,9 @@ import javax.naming.spi.ObjectFactory; import org.hibernate.SessionFactory; +import org.hibernate.boot.spi.BootstrapContext; +import org.hibernate.boot.spi.MetadataImplementor; +import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.engine.jndi.JndiException; import org.hibernate.engine.jndi.JndiNameException; import org.hibernate.engine.jndi.spi.JndiService; @@ -51,6 +54,16 @@ private SessionFactoryRegistry() { REGISTRY_LOGGER.initializingSessionFactoryRegistry( hashCode() ); } + /** + * Create a new instance of the package-private class {@link SessionFactoryImpl}. + */ + public static SessionFactoryImplementor instantiateSessionFactory( + MetadataImplementor bootMetamodel, + SessionFactoryOptions options, + BootstrapContext bootstrapContext) { + return new SessionFactoryImpl( bootMetamodel, options, bootstrapContext ); + } + /** * Adds a SessionFactory to the registry * diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java index f830aaa9500f..70174fe63dd5 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java @@ -151,7 +151,7 @@ * @author Chris Cranford * @author Sanne Grinovero */ -public class SessionImpl +class SessionImpl extends AbstractSharedSessionContract implements Serializable, SharedSessionContractImplementor, JdbcSessionOwner, SessionImplementor, EventSource, TransactionCoordinatorBuilder.Options, WrapperOptions, LoadAccessContext { @@ -180,7 +180,7 @@ public class SessionImpl private transient TransactionObserver transactionObserver; - public SessionImpl(SessionFactoryImpl factory, SessionCreationOptions options) { + SessionImpl(SessionFactoryImpl factory, SessionCreationOptions options) { super( factory, options ); final var sessionOpenEvent = getEventMonitor().beginSessionOpenEvent(); diff --git a/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java index 596b9e108900..3c9130dc6fd2 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java @@ -115,7 +115,7 @@ * @author Gavin King * @author Steve Ebersole */ -public class StatelessSessionImpl extends AbstractSharedSessionContract implements StatelessSessionImplementor { +class StatelessSessionImpl extends AbstractSharedSessionContract implements StatelessSessionImplementor { public static final MultiIdLoadOptions MULTI_ID_LOAD_OPTIONS = new MultiLoadOptions(); @@ -127,7 +127,7 @@ public class StatelessSessionImpl extends AbstractSharedSessionContract implemen private final FlushMode flushMode; private final EventListenerGroups eventListenerGroups; - public StatelessSessionImpl(SessionFactoryImpl factory, SessionCreationOptions options) { + StatelessSessionImpl(SessionFactoryImpl factory, SessionCreationOptions options) { super( factory, options ); connectionProvided = options.getConnection() != null; if ( options instanceof SharedSessionCreationOptions sharedOptions diff --git a/hibernate-core/src/main/java/org/hibernate/internal/AbstractScrollableResults.java b/hibernate-core/src/main/java/org/hibernate/internal/scrollable/AbstractScrollableResults.java similarity index 98% rename from hibernate-core/src/main/java/org/hibernate/internal/AbstractScrollableResults.java rename to hibernate-core/src/main/java/org/hibernate/internal/scrollable/AbstractScrollableResults.java index fcf2501bda98..acc7df1b457e 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/AbstractScrollableResults.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/scrollable/AbstractScrollableResults.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.internal; +package org.hibernate.internal.scrollable; import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; diff --git a/hibernate-core/src/main/java/org/hibernate/internal/EmptyScrollableResults.java b/hibernate-core/src/main/java/org/hibernate/internal/scrollable/EmptyScrollableResults.java similarity index 97% rename from hibernate-core/src/main/java/org/hibernate/internal/EmptyScrollableResults.java rename to hibernate-core/src/main/java/org/hibernate/internal/scrollable/EmptyScrollableResults.java index 812501a00d4c..24f4137c92a0 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/EmptyScrollableResults.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/scrollable/EmptyScrollableResults.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.internal; +package org.hibernate.internal.scrollable; import org.hibernate.query.spi.ScrollableResultsImplementor; diff --git a/hibernate-core/src/main/java/org/hibernate/internal/FetchingScrollableResultsImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/scrollable/FetchingScrollableResultsImpl.java similarity index 99% rename from hibernate-core/src/main/java/org/hibernate/internal/FetchingScrollableResultsImpl.java rename to hibernate-core/src/main/java/org/hibernate/internal/scrollable/FetchingScrollableResultsImpl.java index 69d23a408d1e..0e49c6c72061 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/FetchingScrollableResultsImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/scrollable/FetchingScrollableResultsImpl.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.internal; +package org.hibernate.internal.scrollable; import org.hibernate.HibernateException; import org.hibernate.engine.spi.EntityKey; diff --git a/hibernate-core/src/main/java/org/hibernate/internal/ScrollableResultsImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/scrollable/ScrollableResultsImpl.java similarity index 98% rename from hibernate-core/src/main/java/org/hibernate/internal/ScrollableResultsImpl.java rename to hibernate-core/src/main/java/org/hibernate/internal/scrollable/ScrollableResultsImpl.java index 1d46a49a2652..efc25a50a821 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/ScrollableResultsImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/scrollable/ScrollableResultsImpl.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.internal; +package org.hibernate.internal.scrollable; import org.hibernate.engine.spi.PersistenceContext; import org.hibernate.engine.spi.SharedSessionContractImplementor; diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Collection.java b/hibernate-core/src/main/java/org/hibernate/mapping/Collection.java index 7622ad199e03..df98cf2be022 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Collection.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Collection.java @@ -14,7 +14,6 @@ import org.hibernate.collection.internal.CustomCollectionTypeSemantics; import org.hibernate.collection.spi.CollectionSemantics; import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle; -import org.hibernate.internal.FilterConfiguration; import org.hibernate.internal.util.PropertiesHelper; import org.hibernate.internal.util.StringHelper; import org.hibernate.jdbc.Expectation; diff --git a/hibernate-core/src/main/java/org/hibernate/internal/FilterConfiguration.java b/hibernate-core/src/main/java/org/hibernate/mapping/FilterConfiguration.java similarity index 96% rename from hibernate-core/src/main/java/org/hibernate/internal/FilterConfiguration.java rename to hibernate-core/src/main/java/org/hibernate/mapping/FilterConfiguration.java index c37876b7e864..c5934d5a1dce 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/FilterConfiguration.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/FilterConfiguration.java @@ -2,13 +2,12 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.internal; +package org.hibernate.mapping; import java.util.HashMap; import java.util.Map; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.mapping.PersistentClass; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Filterable.java b/hibernate-core/src/main/java/org/hibernate/mapping/Filterable.java index 84d8fd1946bc..d417fe2baf6e 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Filterable.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Filterable.java @@ -4,8 +4,9 @@ */ package org.hibernate.mapping; +import java.util.List; +import java.util.Map; -import org.hibernate.internal.FilterConfiguration; /** * Defines mapping elements to which filters may be applied. @@ -13,7 +14,9 @@ * @author Steve Ebersole */ public interface Filterable { - void addFilter(String name, String condition, boolean autoAliasInjection, java.util.Map aliasTableMap, java.util.Map aliasEntityMap); + void addFilter( + String name, String condition, boolean autoAliasInjection, + Map aliasTableMap, Map aliasEntityMap); - java.util.List getFilters(); + List getFilters(); } diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/PersistentClass.java b/hibernate-core/src/main/java/org/hibernate/mapping/PersistentClass.java index afbeedafbb80..b53e780c0b5a 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/PersistentClass.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/PersistentClass.java @@ -23,7 +23,6 @@ import org.hibernate.dialect.Dialect; import org.hibernate.engine.OptimisticLockStyle; import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle; -import org.hibernate.internal.FilterConfiguration; import org.hibernate.internal.util.collections.JoinedList; import org.hibernate.jdbc.Expectation; import org.hibernate.jpa.event.spi.CallbackDefinition; diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Subclass.java b/hibernate-core/src/main/java/org/hibernate/mapping/Subclass.java index a0c6041d5913..8a420fb15bbe 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Subclass.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Subclass.java @@ -11,7 +11,6 @@ import org.hibernate.Internal; import org.hibernate.boot.spi.MetadataBuildingContext; import org.hibernate.engine.OptimisticLockStyle; -import org.hibernate.internal.FilterConfiguration; import org.hibernate.internal.util.collections.JoinedList; /** @@ -286,7 +285,7 @@ public Object accept(PersistentClassVisitor mv) { @Override public java.util.List getFilters() { - final ArrayList filters = new ArrayList<>( super.getFilters() ); + final var filters = new ArrayList<>( super.getFilters() ); filters.addAll( getSuperclass().getFilters() ); return filters; } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/filter/internal/FilterHelper.java b/hibernate-core/src/main/java/org/hibernate/persister/filter/internal/FilterHelper.java index 668d4d212de9..644e580d19fe 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/filter/internal/FilterHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/filter/internal/FilterHelper.java @@ -13,7 +13,7 @@ import org.hibernate.Filter; import org.hibernate.engine.spi.LoadQueryInfluencers; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.internal.FilterConfiguration; +import org.hibernate.mapping.FilterConfiguration; import org.hibernate.metamodel.mapping.Restrictable; import org.hibernate.persister.entity.EntityNameUse; import org.hibernate.persister.filter.FilterAliasGenerator; @@ -59,7 +59,7 @@ public FilterHelper(List filters, SessionFactoryImplementor * @param factory The session factory */ public FilterHelper(List filters, Map tableToEntityName, SessionFactoryImplementor factory) { - int filterCount = filters.size(); + final int filterCount = filters.size(); filterNames = new String[filterCount]; filterConditions = new String[filterCount]; @@ -68,19 +68,17 @@ public FilterHelper(List filters, Map table parameterNames = new List[filterCount]; this.tableToEntityName = tableToEntityName; - filterCount = 0; - for ( final FilterConfiguration filter : filters ) { + for ( int i = 0; i < filters.size(); i++ ) { + final var filter = filters.get( i ); final String filterName = safeInterning( filter.getName() ); - filterNames[filterCount] = filterName; - filterConditions[filterCount] = safeInterning( filter.getCondition() ); + filterNames[i] = filterName; + filterConditions[i] = safeInterning( filter.getCondition() ); - filterAliasTableMaps[filterCount] = filter.getAliasTableMap( factory ); - filterAutoAliasFlags[filterCount] = false; + filterAliasTableMaps[i] = filter.getAliasTableMap( factory ); + filterAutoAliasFlags[i] = false; - injectAliases( factory, filter, filterCount ); - qualifyParameterNames( filterCount, filterName ); - - filterCount++; + injectAliases( factory, filter, i ); + qualifyParameterNames( i, filterName ); } } @@ -193,15 +191,13 @@ private FilterPredicate generateFilterPredicate( for ( int i = 0, max = filterNames.length; i < max; i++ ) { final var enabledFilter = enabledFilters.get( filterNames[i] ); if ( enabledFilter != null && ( !onlyApplyLoadByKeyFilters || enabledFilter.isAppliedToLoadByKey() ) ) { - filterPredicate.applyFragment( render( aliasGenerator, i, tableGroup, creationState ), enabledFilter, parameterNames[i] ); + filterPredicate.applyFragment( render( aliasGenerator, i, tableGroup, creationState ), + enabledFilter, parameterNames[i] ); } } - if ( filterPredicate.isEmpty() ) { - return null; - } + return filterPredicate.isEmpty() ? null : filterPredicate; - return filterPredicate; } public String render(FilterAliasGenerator aliasGenerator, Map enabledFilters) { @@ -213,13 +209,12 @@ public String render(FilterAliasGenerator aliasGenerator, Map en public void render(StringBuilder buffer, FilterAliasGenerator aliasGenerator, Map enabledFilters) { if ( isNotEmpty( filterNames ) ) { for ( int i = 0, max = filterNames.length; i < max; i++ ) { - if ( enabledFilters.containsKey( filterNames[i] ) ) { - if ( isNotEmpty( filterConditions[i] ) ) { - if ( !buffer.isEmpty() ) { - buffer.append( " and " ); - } - buffer.append( render( aliasGenerator, i, null, null ) ); + if ( enabledFilters.containsKey( filterNames[i] ) + && isNotEmpty( filterConditions[i] ) ) { + if ( !buffer.isEmpty() ) { + buffer.append( " and " ); } + buffer.append( render( aliasGenerator, i, null, null ) ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeSelectQueryPlanImpl.java b/hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeSelectQueryPlanImpl.java index 9ef013058a91..39c143e382ae 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeSelectQueryPlanImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeSelectQueryPlanImpl.java @@ -11,7 +11,7 @@ import org.hibernate.ScrollMode; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.internal.EmptyScrollableResults; +import org.hibernate.internal.scrollable.EmptyScrollableResults; import org.hibernate.query.results.ResultSetMapping; import org.hibernate.query.spi.DomainQueryExecutionContext; import org.hibernate.query.spi.QueryOptions; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/AggregatedSelectQueryPlanImpl.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/AggregatedSelectQueryPlanImpl.java index c8b5c00be402..3083d908612f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/AggregatedSelectQueryPlanImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/AggregatedSelectQueryPlanImpl.java @@ -9,7 +9,7 @@ import java.util.List; import org.hibernate.ScrollMode; -import org.hibernate.internal.EmptyScrollableResults; +import org.hibernate.internal.scrollable.EmptyScrollableResults; import org.hibernate.query.spi.DomainQueryExecutionContext; import org.hibernate.query.spi.Limit; import org.hibernate.query.spi.ScrollableResultsImplementor; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java index 26a4be4d4847..9f8abd3e090f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java @@ -10,7 +10,7 @@ import org.hibernate.ScrollMode; import org.hibernate.engine.spi.EntityHolder; import org.hibernate.engine.spi.SubselectFetch; -import org.hibernate.internal.EmptyScrollableResults; +import org.hibernate.internal.scrollable.EmptyScrollableResults; import org.hibernate.internal.util.MutableObject; import org.hibernate.metamodel.mapping.MappingModelExpressible; import org.hibernate.query.QueryTypeMismatchException; diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java index 1e45e020b1ec..e382818f8669 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java @@ -18,7 +18,6 @@ import org.hibernate.engine.jdbc.Size; import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.internal.FilterJdbcParameter; import org.hibernate.internal.util.MathHelper; import org.hibernate.internal.util.QuotingHelper; import org.hibernate.internal.util.StringHelper; diff --git a/hibernate-core/src/main/java/org/hibernate/internal/FilterJdbcParameter.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/FilterJdbcParameter.java similarity index 88% rename from hibernate-core/src/main/java/org/hibernate/internal/FilterJdbcParameter.java rename to hibernate-core/src/main/java/org/hibernate/sql/ast/spi/FilterJdbcParameter.java index 9f265eedf95a..cd058964d304 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/FilterJdbcParameter.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/FilterJdbcParameter.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.internal; +package org.hibernate.sql.ast.spi; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -19,11 +19,11 @@ /** * @author Nathan Xu */ -public class FilterJdbcParameter implements JdbcParameter, JdbcParameterBinder { +class FilterJdbcParameter implements JdbcParameter, JdbcParameterBinder { private final JdbcMapping jdbcMapping; private final Object jdbcParameterValue; - public FilterJdbcParameter(JdbcMapping jdbcMapping, Object jdbcParameterValue) { + FilterJdbcParameter(JdbcMapping jdbcMapping, Object jdbcParameterValue) { this.jdbcMapping = jdbcMapping; this.jdbcParameterValue = jdbcParameterValue; } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/predicate/FilterPredicate.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/predicate/FilterPredicate.java index 0506ea3bdcf8..c9d27bef411f 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/predicate/FilterPredicate.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/predicate/FilterPredicate.java @@ -8,12 +8,13 @@ import java.util.List; import org.hibernate.Filter; -import org.hibernate.internal.FilterJdbcParameter; import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.JdbcMappingContainer; import org.hibernate.sql.ast.SqlAstWalker; +import static org.hibernate.internal.util.collections.CollectionHelper.arrayList; + /** * Collection of {@link FilterFragmentPredicate} sub-predicates, each * representing one {@linkplain org.hibernate.Filter enabled filter} restriction. @@ -24,7 +25,7 @@ public class FilterPredicate implements Predicate { private final List fragments = new ArrayList<>(); - private List parameters; +// private List parameters; public FilterPredicate() { } @@ -34,23 +35,23 @@ public void applyFragment(FilterFragmentPredicate predicate) { } public void applyFragment(String processedFragment, Filter filter, List parameterNames) { - fragments.add( new FilterFragmentPredicate( processedFragment, filter, parameterNames ) ); + applyFragment( new FilterFragmentPredicate( processedFragment, filter, parameterNames ) ); } - public void applyParameter(FilterJdbcParameter parameter) { - if ( parameters == null ) { - parameters = new ArrayList<>(); - } - parameters.add( parameter ); - } +// public void applyParameter(FilterJdbcParameter parameter) { +// if ( parameters == null ) { +// parameters = new ArrayList<>(); +// } +// parameters.add( parameter ); +// } public List getFragments() { return fragments; } - public List getParameters() { - return parameters; - } +// public List getParameters() { +// return parameters; +// } @Override public boolean isEmpty() { @@ -67,13 +68,30 @@ public JdbcMappingContainer getExpressionType() { return null; } + private static List fragmentParameters(Filter filter, List parameterNames) { + if ( CollectionHelper.isEmpty( parameterNames ) ) { + return null; + } + else { + final int parameterCount = parameterNames.size(); + final List parameters = arrayList( parameterCount ); + for ( int i = 0; i < parameterCount; i++ ) { + final String paramName = parameterNames.get( i ); + final Object paramValue = filter.getParameterValue( paramName ); + final var jdbcMapping = filter.getFilterDefinition().getParameterJdbcMapping( paramName ); + parameters.add( new FilterFragmentParameter( filter.getName(), paramName, jdbcMapping, paramValue ) ); + } + return parameters; + } + } + public static class FilterFragmentParameter { private final String filterName; private final String parameterName; private final JdbcMapping valueMapping; private final Object value; - public FilterFragmentParameter(String filterName, String parameterName, JdbcMapping valueMapping, Object value) { + FilterFragmentParameter(String filterName, String parameterName, JdbcMapping valueMapping, Object value) { this.filterName = filterName; this.parameterName = parameterName; this.valueMapping = valueMapping; @@ -102,23 +120,10 @@ public static class FilterFragmentPredicate implements Predicate { private final String sqlFragment; private final List parameters; - public FilterFragmentPredicate(String sqlFragment, Filter filter, List parameterNames) { + FilterFragmentPredicate(String sqlFragment, Filter filter, List parameterNames) { this.filter = filter; this.sqlFragment = sqlFragment; - - if ( CollectionHelper.isEmpty( parameterNames ) ) { - parameters = null; - } - else { - parameters = CollectionHelper.arrayList( parameterNames.size() ); - for ( int i = 0; i < parameterNames.size(); i++ ) { - final String paramName = parameterNames.get( i ); - final Object paramValue = filter.getParameterValue( paramName ); - final JdbcMapping jdbcMapping = filter.getFilterDefinition().getParameterJdbcMapping( paramName ); - - parameters.add( new FilterFragmentParameter( filter.getName(), paramName, jdbcMapping, paramValue ) ); - } - } + this.parameters = fragmentParameters( filter, parameterNames ); } public Filter getFilter() { diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ScrollableResultsConsumer.java b/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ScrollableResultsConsumer.java index 52bf6d4251e9..b0d6175ecdb2 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ScrollableResultsConsumer.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ScrollableResultsConsumer.java @@ -7,8 +7,8 @@ import java.util.List; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.internal.FetchingScrollableResultsImpl; -import org.hibernate.internal.ScrollableResultsImpl; +import org.hibernate.internal.scrollable.FetchingScrollableResultsImpl; +import org.hibernate.internal.scrollable.ScrollableResultsImpl; import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.entity.EntityResult; import org.hibernate.sql.results.jdbc.spi.JdbcValuesMapping; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/batch/EmbeddableBatchingTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/batch/EmbeddableBatchingTest.java index 693cb514d268..5aa18bda9acc 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/batch/EmbeddableBatchingTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/batch/EmbeddableBatchingTest.java @@ -9,7 +9,7 @@ import org.hibernate.cfg.Environment; import org.hibernate.engine.spi.EntityEntry; -import org.hibernate.internal.SessionImpl; +import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.testing.orm.junit.JiraKey; @@ -76,9 +76,9 @@ void testSelect(EntityManagerFactoryScope scope) { assertThat( entityA ).isEqualTo( ENTITY_A ); - EntityEntry entry = ( (SessionImpl) entityManager ).getPersistenceContext().getEntry( entityA ); + EntityEntry entry = ( (SessionImplementor) entityManager ).getPersistenceContext().getEntry( entityA ); Object[] loadedState = entry.getLoadedState(); - EntityPersister persister = ( (SessionImpl) entityManager ).getEntityPersister( + EntityPersister persister = ( (SessionImplementor) entityManager ).getEntityPersister( "EntityA", entityA ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/EntityManagerFactoryUnwrapTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/EntityManagerFactoryUnwrapTest.java index 28ac09fcd64a..ace0fc0881c7 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/EntityManagerFactoryUnwrapTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/EntityManagerFactoryUnwrapTest.java @@ -6,7 +6,6 @@ import org.hibernate.SessionFactory; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.internal.SessionFactoryImpl; import org.hibernate.testing.orm.junit.JiraKey; import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; @@ -46,8 +45,8 @@ public void testEntityManagerCanBeUnwrappedToObject(EntityManagerFactoryScope sc @Test public void testEntityManagerCanBeUnwrappedToSessionFactoryImpl(EntityManagerFactoryScope scope) { - SessionFactoryImpl sessionFactory = scope.getEntityManagerFactory().unwrap( SessionFactoryImpl.class ); - assertNotNull( sessionFactory, "Unwrapping to SessionFactoryImpl should be ok" ); + SessionFactoryImplementor sessionFactory = scope.getEntityManagerFactory().unwrap( SessionFactoryImplementor.class ); + assertNotNull( sessionFactory, "Unwrapping to SessionFactoryImplementor should be ok" ); } @Test diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/QueryLockingTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/QueryLockingTest.java index a50952b5086d..423ee585bc0e 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/QueryLockingTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/QueryLockingTest.java @@ -9,7 +9,7 @@ import org.hibernate.LockMode; import org.hibernate.dialect.CockroachDialect; import org.hibernate.dialect.SQLServerDialect; -import org.hibernate.internal.SessionImpl; +import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.query.NativeQuery; import org.hibernate.testing.orm.junit.DialectFeatureChecks; @@ -211,7 +211,7 @@ public void testOptimisticOverall(EntityManagerFactoryScope scope) { .setLockMode( LockModeType.OPTIMISTIC ) .getSingleResult(); assertEquals( initial, reread.getVersion() ); - assertTrue( em.unwrap( SessionImpl.class ).getActionQueue().hasBeforeTransactionActions() ); + assertTrue( em.unwrap( SessionImplementor.class ).getActionQueue().hasBeforeTransactionActions() ); return reread.getId(); } ); scope.inTransaction( em -> { @@ -234,7 +234,7 @@ public void testOptimisticSpecific(EntityManagerFactoryScope scope) { .setHint( HINT_NATIVE_LOCK_MODE, LockModeType.OPTIMISTIC ) .getSingleResult(); assertEquals( initial, reread.getVersion() ); - assertTrue( em.unwrap( SessionImpl.class ).getActionQueue().hasBeforeTransactionActions() ); + assertTrue( em.unwrap( SessionImplementor.class ).getActionQueue().hasBeforeTransactionActions() ); return reread.getId(); } ); scope.inTransaction( em -> { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/CloseEntityManagerWithActiveTransactionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/CloseEntityManagerWithActiveTransactionTest.java index 1143554aa194..5ba51c9a12a3 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/CloseEntityManagerWithActiveTransactionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/CloseEntityManagerWithActiveTransactionTest.java @@ -21,10 +21,9 @@ import jakarta.transaction.Status; import jakarta.transaction.TransactionManager; -import org.hibernate.Session; import org.hibernate.cfg.AvailableSettings; import org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl; -import org.hibernate.internal.SessionImpl; +import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.testing.orm.junit.JiraKey; import org.hibernate.testing.jta.TestingJtaPlatformImpl; @@ -303,7 +302,7 @@ public void testCommitReleasesLogicalConnection(EntityManagerFactoryScope scope) Box box = new Box(); box.setColor( "red-and-white" ); em.persist( box ); - final SessionImpl session = (SessionImpl) em.unwrap( Session.class ); + final SessionImplementor session = em.unwrap( SessionImplementor.class ); return (JdbcCoordinatorImpl) session.getJdbcCoordinator(); } ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionJoinHandlingChecker.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionJoinHandlingChecker.java index adec96a05269..7d7cce16733d 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionJoinHandlingChecker.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionJoinHandlingChecker.java @@ -8,8 +8,8 @@ import jakarta.transaction.Status; import jakarta.transaction.TransactionManager; +import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper; -import org.hibernate.internal.SessionImpl; import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl; import org.hibernate.testing.jta.TestingJtaPlatformImpl; @@ -28,7 +28,7 @@ public class TransactionJoinHandlingChecker { public static void validateExplicitJoiningHandling(EntityManager entityManager) throws Exception { TransactionManager transactionManager = TestingJtaPlatformImpl.INSTANCE.getTransactionManager(); - try (SessionImpl session = entityManager.unwrap( SessionImpl.class )) { + try (SessionImplementor session = entityManager.unwrap( SessionImplementor.class )) { ExtraAssertions.assertTyping( JtaTransactionCoordinatorImpl.class, session.getTransactionCoordinator() ); JtaTransactionCoordinatorImpl transactionCoordinator = (JtaTransactionCoordinatorImpl) session.getTransactionCoordinator(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionJoiningTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionJoiningTest.java index d13031862bb5..f122069d198f 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionJoiningTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionJoiningTest.java @@ -14,9 +14,9 @@ import org.hibernate.HibernateException; import org.hibernate.cfg.AvailableSettings; +import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper; -import org.hibernate.internal.SessionImpl; import org.hibernate.orm.test.jpa.txn.JtaTransactionJoiningTest; import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl; @@ -280,7 +280,7 @@ public void testMultiThreadTransactionTimeout(EntityManagerFactoryScope scope) t em = scope.getEntityManagerFactory().createEntityManager(); - final SessionImpl sImpl = em.unwrap( SessionImpl.class ); + final SessionImplementor sImpl = em.unwrap( SessionImplementor.class ); final CountDownLatch latch = new CountDownLatch( 1 ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/lazyload/LazyLoadingLoggingTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/lazyload/LazyLoadingLoggingTest.java index 3920bd5e7cab..d96203c865f0 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/lazyload/LazyLoadingLoggingTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/lazyload/LazyLoadingLoggingTest.java @@ -12,7 +12,6 @@ import jakarta.persistence.OneToOne; import org.hibernate.LazyInitializationException; -import org.hibernate.internal.AbstractSharedSessionContract; import org.hibernate.testing.orm.junit.JiraKey; import org.hibernate.testing.orm.junit.DomainModel; @@ -87,8 +86,7 @@ public void testDisconnect(SessionFactoryScope scope) { scope.inTransaction( session -> { Address address = session.getReference( Address.class, 1L ); - AbstractSharedSessionContract sessionContract = (AbstractSharedSessionContract) session; - sessionContract.getJdbcCoordinator().close(); + session.getJdbcCoordinator().close(); try { address.getClient().getName(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/naturalid/mutable/cached/CachedMutableNaturalIdTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/naturalid/mutable/cached/CachedMutableNaturalIdTest.java index 84cde0624f52..44d4804636d4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/naturalid/mutable/cached/CachedMutableNaturalIdTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/naturalid/mutable/cached/CachedMutableNaturalIdTest.java @@ -4,7 +4,7 @@ */ package org.hibernate.orm.test.mapping.naturalid.mutable.cached; -import org.hibernate.internal.SessionFactoryImpl; +import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.stat.spi.StatisticsImplementor; import org.hibernate.testing.orm.junit.JiraKey; @@ -207,13 +207,13 @@ public void testCacheVerifyHits(SessionFactoryScope scope) { AllCached aAllCached = new AllCached(); aAllCached.setName("John Doe"); session.persist(aAllCached); - SessionFactoryImpl sfi = (SessionFactoryImpl) session.getSessionFactory(); + SessionFactoryImplementor sfi = session.getSessionFactory(); sfi.getStatistics().clear(); }); scope.inTransaction((session) -> { System.out.println("Native load by natural-id, generate first hit"); - SessionFactoryImpl sfi = (SessionFactoryImpl) session.getSessionFactory(); + SessionFactoryImplementor sfi = session.getSessionFactory(); AllCached person = session.bySimpleNaturalId(AllCached.class).load("John Doe"); assertNotNull(person); System.out.println("NaturalIdCacheHitCount: " + sfi.getStatistics().getNaturalIdCacheHitCount()); @@ -225,7 +225,7 @@ public void testCacheVerifyHits(SessionFactoryScope scope) { scope.inTransaction((session) -> { System.out.println("Native load by natural-id, generate second hit"); - SessionFactoryImpl sfi = (SessionFactoryImpl) session.getSessionFactory(); + SessionFactoryImplementor sfi = session.getSessionFactory(); //tag::caching-entity-natural-id-example[] AllCached person = session.bySimpleNaturalId(AllCached.class).load("John Doe"); assertNotNull(person); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/beancontainer/MultiTenantConnectionProviderFromBeanContainerTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/beancontainer/MultiTenantConnectionProviderFromBeanContainerTest.java index 169eede03b34..c54818e771cf 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/beancontainer/MultiTenantConnectionProviderFromBeanContainerTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/beancontainer/MultiTenantConnectionProviderFromBeanContainerTest.java @@ -10,7 +10,7 @@ import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.H2Dialect; import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider; -import org.hibernate.internal.SessionFactoryImpl; +import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.orm.test.multitenancy.AbstractMultiTenancyTest; import org.hibernate.orm.test.multitenancy.ConfigurableMultiTenantConnectionProvider; import org.hibernate.resource.beans.container.spi.BeanContainer; @@ -88,7 +88,9 @@ protected String tenantUrl(String originalUrl, String tenantIdentifier) { @Test public void testProviderInUse() { - MultiTenantConnectionProvider providerInUse = ((SessionFactoryImpl) sessionFactory).getServiceRegistry().getService( MultiTenantConnectionProvider.class ); + MultiTenantConnectionProvider providerInUse = + ((SessionFactoryImplementor) sessionFactory).getServiceRegistry() + .getService( MultiTenantConnectionProvider.class ); assertThat( providerInUse).isSameAs( expectedProviderInUse() ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/proxy/ProxyTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/proxy/ProxyTest.java index be7adc1e5664..3fdffd619807 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/proxy/ProxyTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/proxy/ProxyTest.java @@ -12,7 +12,6 @@ import org.hibernate.Session; import org.hibernate.cfg.Environment; import org.hibernate.engine.spi.SessionImplementor; -import org.hibernate.internal.SessionImpl; import org.hibernate.internal.util.SerializationHelper; import org.hibernate.proxy.HibernateProxy; import org.hibernate.testing.orm.junit.DomainModel; @@ -480,13 +479,12 @@ public void testFullyLoadedPCSerialization(SessionFactoryScope scope) { Container.class ) .setParameter( "l", lastContainerId ) .list(); - Container container = (Container) all.get( 0 ); + Container container = all.get( 0 ); session.remove( container ); // force a snapshot retrieval of the proxied container - SessionImpl sImpl = (SessionImpl) session; - sImpl.getPersistenceContext().getDatabaseSnapshot( + session.getPersistenceContext().getDatabaseSnapshot( lastContainerId, - sImpl.getFactory().getMappingMetamodel() + session.getFactory().getMappingMetamodel() .getEntityDescriptor( Container.class.getName() ) ); assertThat( Hibernate.isInitialized( proxy ) ).isFalse(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/sharedSession/SessionWithSharedConnectionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/sharedSession/SessionWithSharedConnectionTest.java index a1deb775ea16..d50b77ad0eff 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/sharedSession/SessionWithSharedConnectionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/sharedSession/SessionWithSharedConnectionTest.java @@ -11,7 +11,6 @@ import org.hibernate.event.spi.EventType; import org.hibernate.event.spi.PostInsertEvent; import org.hibernate.event.spi.PostInsertEventListener; -import org.hibernate.internal.SessionImpl; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.testing.orm.junit.JiraKey; @@ -94,7 +93,7 @@ public void testSharedTransactionContextAutoClosing(SessionFactoryScope scope) { // directly assert state of the second session assertTrue( secondSession.isAutoCloseSessionEnabled() ); - assertTrue( ((SessionImpl) secondSession).shouldAutoClose() ); +// assertTrue( ((SessionImpl) secondSession).shouldAutoClose() ); // now commit the transaction and make sure that does not close the sessions session.getTransaction().commit(); @@ -118,7 +117,7 @@ public void testSharedTransactionContextAutoClosing(SessionFactoryScope scope) { // directly assert state of the second session assertTrue( secondSession.isAutoCloseSessionEnabled() ); - assertTrue( ((SessionImpl) secondSession).shouldAutoClose() ); +// assertTrue( ((SessionImpl) secondSession).shouldAutoClose() ); // now rollback the transaction and make sure that does not close the sessions session.getTransaction().rollback(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/type/TypeTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/type/TypeTest.java index c418d59237d3..21c79f555a42 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/type/TypeTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/type/TypeTest.java @@ -5,7 +5,7 @@ package org.hibernate.orm.test.type; import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer; -import org.hibernate.internal.SessionImpl; +import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.util.SerializationHelper; import org.hibernate.internal.util.collections.ArrayHelper; import org.hibernate.testing.orm.junit.BaseUnitTest; @@ -332,7 +332,7 @@ protected void runBasicTests( } protected void runBasicTests(Type type, T original, T copy, T different) { - final SessionImpl session = null; //Not really used + final SharedSessionContractImplementor session = null; //Not really used final boolean nonCopyable = original instanceof Class || original instanceof Currency; if ( ! nonCopyable ) { // these checks exclude classes which cannot really be cloned (singetons/enums) diff --git a/hibernate-testing/src/test/java/org/hibernate/testing/logger/LoggingRuleTest.java b/hibernate-testing/src/test/java/org/hibernate/testing/logger/LoggingRuleTest.java index 07ab28f6a499..8bb5fd05a2a8 100644 --- a/hibernate-testing/src/test/java/org/hibernate/testing/logger/LoggingRuleTest.java +++ b/hibernate-testing/src/test/java/org/hibernate/testing/logger/LoggingRuleTest.java @@ -5,7 +5,6 @@ package org.hibernate.testing.logger; import org.hibernate.internal.CoreMessageLogger; -import org.hibernate.internal.SessionImpl; import org.hibernate.testing.orm.junit.JiraKey; import org.jboss.logging.Logger; import org.junit.Assert; @@ -24,12 +23,12 @@ public class LoggingRuleTest { //Taking this specific logger as a representative example of a Logger //(The purpose of this test is not to log but to exercise the logger methods) - private static final CoreMessageLogger LOG = Logger.getMessageLogger( MethodHandles.lookup(), CoreMessageLogger.class, SessionImpl.class.getName() ); + private static final CoreMessageLogger LOG = Logger.getMessageLogger( MethodHandles.lookup(), CoreMessageLogger.class, LoggingRuleTest.class.getName() ); //We'll generally not be able to access the same LOG *instance* so make sure a fresh lookup //from Logger#getMessageLogger will work fine as well @Rule - public LoggerInspectionRule logInspection = new LoggerInspectionRule( Logger.getMessageLogger( MethodHandles.lookup(), CoreMessageLogger.class, SessionImpl.class.getName() ) ); + public LoggerInspectionRule logInspection = new LoggerInspectionRule( Logger.getMessageLogger( MethodHandles.lookup(), CoreMessageLogger.class, LoggingRuleTest.class.getName() ) ); @Test public void testRule() { From ec49acf93ff12ec2e3351124ae41dd32d2dc9f6e Mon Sep 17 00:00:00 2001 From: Gavin King Date: Mon, 17 Nov 2025 17:49:05 +0100 Subject: [PATCH 2/4] use typesafe logging in EnhancementHelper --- .../BytecodeInterceptorLogging.java | 62 +++++++++++++++++-- .../spi/interceptor/EnhancementHelper.java | 29 ++++----- 2 files changed, 69 insertions(+), 22 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/BytecodeInterceptorLogging.java b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/BytecodeInterceptorLogging.java index 849ad0d467b9..77a410795b9c 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/BytecodeInterceptorLogging.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/BytecodeInterceptorLogging.java @@ -17,6 +17,7 @@ import java.lang.invoke.MethodHandles; import static org.jboss.logging.Logger.Level.TRACE; +import static org.jboss.logging.Logger.Level.DEBUG; import static org.jboss.logging.Logger.Level.WARN; /** @@ -38,13 +39,66 @@ public interface BytecodeInterceptorLogging extends BasicLogger { @LogMessage(level = WARN) @Message( id = 90005901, - value = "'%s.%s' was mapped with explicit lazy group '%s'. Hibernate will ignore the lazy group - this is generally " + - "not a good idea for to-one associations as it leads to two separate SQL selects to initialize the association. " + - "This is expected to be improved in future versions of Hibernate" + value = "Ignoring explicit lazy group '%s' specified for association '%s.%s'" + + " (a lazy group for a to-one association would lead to two separate SELECTs to initialize the association)" ) - void lazyGroupIgnoredForToOne(String ownerName, String attributeName, String requestedLazyGroup); + void lazyGroupIgnoredForToOne(String requestedLazyGroup, String ownerName, String attributeName); @LogMessage(level = TRACE) @Message(id = 90005902, value = "Forcing initialization: %s.%s -> %s") void enhancementAsProxyLazinessForceInitialize(String entityName, Object identifier, String attributeName); + + @LogMessage(level = WARN) + @Message( + id = 90005903, + value = "Unable to commit JDBC transaction on temporary session used to load lazy collection associated to no session" + ) + void unableToCommitTransactionOnTemporarySession(); + + @LogMessage(level = WARN) + @Message( + id = 90005904, + value = "Unable to close temporary session used to load lazy collection associated to no session" + ) + void unableToCloseTemporarySession(); + + // DEBUG messages (type-safe) + + @LogMessage(level = DEBUG) + @Message( + id = 90005905, + value = "To-one property '%s.%s' was mapped with LAZY + NO_PROXY but the class was not enhanced" + ) + void toOneLazyNoProxyButNotEnhanced(String ownerName, String attributeName); + + @LogMessage(level = DEBUG) + @Message( + id = 90005906, + value = "'%s.%s' was mapped with LAZY and explicit NO_PROXY but the associated entity ('%s') has subclasses" + ) + void lazyNoProxyButAssociatedHasSubclasses(String ownerName, String attributeName, String associatedEntityName); + + @LogMessage(level = DEBUG) + @Message( + id = 90005907, + value = "'%s.%s' specified NotFoundAction.IGNORE & LazyToOneOption.NO_PROXY;" + + " skipping foreign key selection to more efficiently handle NotFoundAction.IGNORE" + ) + void notFoundIgnoreWithNoProxySkippingFkSelection(String ownerName, String attributeName); + + @LogMessage(level = DEBUG) + @Message(id = 90005908, value = "Enhancement interception started temporary Session") + void enhancementHelperStartedTemporarySession(); + + @LogMessage(level = DEBUG) + @Message(id = 90005909, value = "Enhancement interception starting transaction on temporary Session") + void enhancementHelperStartingTransactionOnTemporarySession(); + + @LogMessage(level = DEBUG) + @Message(id = 90005910, value = "Enhancement interception committing transaction on temporary Session") + void enhancementHelperCommittingTransactionOnTemporarySession(); + + @LogMessage(level = DEBUG) + @Message(id = 90005911, value = "Enhancement interception closing temporary Session") + void enhancementHelperClosingTemporarySession(); } diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/EnhancementHelper.java b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/EnhancementHelper.java index 5baf960bf21a..2b072677721c 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/EnhancementHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/EnhancementHelper.java @@ -41,8 +41,7 @@ public static boolean includeInBaseFetchGroup( if ( ! isEnhanced ) { if ( value instanceof ToOne toOne ) { if ( toOne.isUnwrapProxy() ) { - BYTECODE_INTERCEPTOR_LOGGER.debugf( - "To-one property `%s#%s` was mapped with LAZY + NO_PROXY but the class was not enhanced", + BYTECODE_INTERCEPTOR_LOGGER.toOneLazyNoProxyButNotEnhanced( bootMapping.getPersistentClass().getEntityName(), bootMapping.getName() ); @@ -73,9 +72,9 @@ public static boolean includeInBaseFetchGroup( // we simply log a message that we are ignoring the `@LazyGroup` for to-ones BYTECODE_INTERCEPTOR_LOGGER.lazyGroupIgnoredForToOne( + bootMapping.getLazyGroup(), bootMapping.getPersistentClass().getEntityName(), - bootMapping.getName(), - bootMapping.getLazyGroup() + bootMapping.getName() ); // at a later time - for example 6.0 when we can implement the join solution @@ -105,8 +104,7 @@ public static boolean includeInBaseFetchGroup( // the associated type has subclasses - we cannot use the enhanced proxy and will generate a HibernateProxy if ( unwrapExplicitlyRequested ) { // NO_PROXY was explicitly requested - BytecodeInterceptorLogging.LOGGER.debugf( - "`%s#%s` was mapped with LAZY and explicit NO_PROXY but the associated entity (`%s`) has subclasses", + BYTECODE_INTERCEPTOR_LOGGER.lazyNoProxyButAssociatedHasSubclasses( bootMapping.getPersistentClass().getEntityName(), bootMapping.getName(), toOne.getReferencedEntityName() @@ -118,9 +116,7 @@ public static boolean includeInBaseFetchGroup( if ( toOne instanceof ManyToOne manyToOne && manyToOne.isIgnoreNotFound() ) { if ( unwrapExplicitlyRequested ) { - BytecodeInterceptorLogging.LOGGER.debugf( - "%s#%s specified NotFoundAction.IGNORE & LazyToOneOption.NO_PROXY; " + - "skipping FK selection to more efficiently handle NotFoundAction.IGNORE", + BYTECODE_INTERCEPTOR_LOGGER.notFoundIgnoreWithNoProxySkippingFkSelection( bootMapping.getPersistentClass().getEntityName(), bootMapping.getName() ); @@ -186,7 +182,7 @@ else if ( !session.isConnected() ) { // If we are using a temporary Session, begin a transaction if necessary if ( isTempSession ) { - BytecodeInterceptorLogging.LOGGER.debug( "Enhancement interception Helper#performWork started temporary Session" ); + BYTECODE_INTERCEPTOR_LOGGER.enhancementHelperStartedTemporarySession(); isJta = session.getTransactionCoordinator().getTransactionCoordinatorBuilder().isJta(); @@ -196,7 +192,7 @@ else if ( !session.isConnected() ) { // be created even if a current session and transaction are // open (ex: session.clear() was used). We must prevent // multiple transactions. - BytecodeInterceptorLogging.LOGGER.debug( "Enhancement interception Helper#performWork starting transaction on temporary Session" ); + BYTECODE_INTERCEPTOR_LOGGER.enhancementHelperStartingTransactionOnTemporarySession(); session.beginTransaction(); } } @@ -213,24 +209,21 @@ else if ( !session.isConnected() ) { try { // Commit the JDBC transaction if we started one. if ( !isJta ) { - BytecodeInterceptorLogging.LOGGER.debug( "Enhancement interception Helper#performWork committing transaction on temporary Session" ); + BYTECODE_INTERCEPTOR_LOGGER.enhancementHelperCommittingTransactionOnTemporarySession(); session.getTransaction().commit(); } } catch (Exception e) { - BytecodeInterceptorLogging.LOGGER.warn( - "Unable to commit JDBC transaction on temporary session used to load lazy " + - "collection associated to no session" - ); + BYTECODE_INTERCEPTOR_LOGGER.unableToCommitTransactionOnTemporarySession(); } // Close the just opened temp Session try { - BytecodeInterceptorLogging.LOGGER.debug( "Enhancement interception Helper#performWork closing temporary Session" ); + BYTECODE_INTERCEPTOR_LOGGER.enhancementHelperClosingTemporarySession(); session.close(); } catch (Exception e) { - BytecodeInterceptorLogging.LOGGER.warn( "Unable to close temporary session used to load lazy collection associated to no session" ); + BYTECODE_INTERCEPTOR_LOGGER.unableToCloseTemporarySession(); } } } From 09911ef148b08260cb8d110d79d4859e4aa07b95 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Mon, 17 Nov 2025 18:15:53 +0100 Subject: [PATCH 3/4] some minor cleanups in interceptor package --- .../spi/interceptor/AbstractInterceptor.java | 25 +++--- ...EnhancementAsProxyLazinessInterceptor.java | 24 +++--- .../LazyAttributeLoadingInterceptor.java | 76 ++++++++++--------- .../interceptor/LazyAttributesMetadata.java | 9 ++- .../SessionAssociationMarkers.java | 40 +++++----- 5 files changed, 83 insertions(+), 91 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/AbstractInterceptor.java b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/AbstractInterceptor.java index aa44d4ea92e6..f11f867bd40a 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/AbstractInterceptor.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/AbstractInterceptor.java @@ -18,13 +18,13 @@ protected AbstractInterceptor() { @Override public SharedSessionContractImplementor getLinkedSession() { - return this.sessionAssociation != null ? this.sessionAssociation.session : null; + return sessionAssociation != null ? sessionAssociation.session : null; } @Override public void setSession(SharedSessionContractImplementor session) { if ( session != null ) { - this.sessionAssociation = session.getSessionAssociationMarkers(); + sessionAssociation = session.getSessionAssociationMarkers(); } else { unsetSession(); @@ -33,31 +33,24 @@ public void setSession(SharedSessionContractImplementor session) { @Override public void unsetSession() { - if ( this.sessionAssociation != null ) { + if ( sessionAssociation != null ) { //We shouldn't mutate the original instance as it's shared across multiple entities, //but we can get a version of it which represents the same state except it doesn't have the session set: - this.sessionAssociation = this.sessionAssociation.deAssociatedCopy(); + sessionAssociation = sessionAssociation.deAssociatedCopy(); } } @Override public boolean allowLoadOutsideTransaction() { - if ( this.sessionAssociation != null ) { - return this.sessionAssociation.allowLoadOutsideTransaction; - } - else { - return false; - } + return sessionAssociation != null + && sessionAssociation.allowLoadOutsideTransaction; } @Override public String getSessionFactoryUuid() { - if ( this.sessionAssociation != null ) { - return this.sessionAssociation.sessionFactoryUuid; - } - else { - return null; - } + return sessionAssociation != null + ? sessionAssociation.sessionFactoryUuid + : null; } /** 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 63f4c4ebb4b1..b31092fa3151 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 @@ -4,7 +4,6 @@ */ package org.hibernate.bytecode.enhance.spi.interceptor; -import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -17,6 +16,7 @@ import org.hibernate.type.CompositeType; import org.hibernate.type.Type; +import static java.util.Collections.emptySet; import static java.util.Collections.unmodifiableSet; import static org.hibernate.bytecode.enhance.spi.interceptor.BytecodeInterceptorLogging.BYTECODE_INTERCEPTOR_LOGGER; import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable; @@ -27,7 +27,9 @@ /** * @author Steve Ebersole */ -public class EnhancementAsProxyLazinessInterceptor extends AbstractInterceptor implements BytecodeLazyAttributeInterceptor { +public class EnhancementAsProxyLazinessInterceptor + extends AbstractInterceptor + implements BytecodeLazyAttributeInterceptor { private final EntityKey entityKey; private final EntityRelatedState meta; @@ -83,7 +85,7 @@ private Object read( if ( writtenFieldNames != null && !writtenFieldNames.isEmpty() ) { // enhancement has dirty-tracking available and at least one attribute was explicitly set - final EntityPersister entityPersister = meta.persister; + final var entityPersister = meta.persister; if ( writtenFieldNames.contains( attributeName ) ) { // the requested attribute was one of the attributes explicitly set, // we can just return the explicitly-set value @@ -116,7 +118,7 @@ private Object read( if ( writtenAttributeValues != null ) { // here is the replaying of the explicitly set values we prepared above for ( int i = 0; i < writtenAttributeMappings.length; i++ ) { - final AttributeMapping attribute = writtenAttributeMappings[i]; + final var attribute = writtenAttributeMappings[i]; attribute.setValue(target, writtenAttributeValues[i] ); if ( meta.inLineDirtyChecking ) { asSelfDirtinessTracker(target).$$_hibernate_trackChange( attribute.getAttributeName() ); @@ -130,7 +132,7 @@ private Object read( private Object extractIdValue(Object target, String attributeName) { // access to the id or part of it for non-aggregated cid - final CompositeType nonAggregatedCidMapper = meta.nonAggregatedCidMapper; + final var nonAggregatedCidMapper = meta.nonAggregatedCidMapper; if ( nonAggregatedCidMapper == null ) { return getIdentifier(); } @@ -200,7 +202,7 @@ protected Object handleWrite(Object target, String attributeName, Object oldValu } else { final int subAttrIndex = meta.nonAggregatedCidMapper.getPropertyIndex( attributeName ); - final Type subAttrType = meta.nonAggregatedCidMapper.getSubtypes()[subAttrIndex]; + final var subAttrType = meta.nonAggregatedCidMapper.getSubtypes()[subAttrIndex]; changed = ! subAttrType.isEqual( oldValue, newValue ); } @@ -245,7 +247,7 @@ protected Object handleWrite(Object target, String attributeName, Object oldValu @Override public Set getInitializedLazyAttributeNames() { - return Collections.emptySet(); + return emptySet(); } @Override @@ -347,18 +349,18 @@ public EntityRelatedState(EntityPersister persister, tmpCollectionAttributeNames.add( propertyNames[i] ); } } - this.collectionAttributeNames = toSmallSet( unmodifiableSet( tmpCollectionAttributeNames ) ); + collectionAttributeNames = toSmallSet( unmodifiableSet( tmpCollectionAttributeNames ) ); } else { - this.collectionAttributeNames = Collections.emptySet(); + collectionAttributeNames = emptySet(); } - this.inLineDirtyChecking = isSelfDirtinessTrackerType( persister.getMappedClass() ); + inLineDirtyChecking = isSelfDirtinessTrackerType( persister.getMappedClass() ); // if self-dirty tracking is enabled but DynamicUpdate is not enabled then we need to // initialize the entity because the precomputed update statement contains even not // dirty properties. And so we need all the values we have to initialize. Or, if it's // versioned, we need to fetch the current version. - this.initializeBeforeWrite = + initializeBeforeWrite = !inLineDirtyChecking || !persister.isDynamicUpdate() || persister.isVersioned(); diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/LazyAttributeLoadingInterceptor.java b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/LazyAttributeLoadingInterceptor.java index 50bb275549ce..1b52ae987404 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/LazyAttributeLoadingInterceptor.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/LazyAttributeLoadingInterceptor.java @@ -5,7 +5,6 @@ package org.hibernate.bytecode.enhance.spi.interceptor; import java.util.Collection; -import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -13,11 +12,10 @@ import org.hibernate.bytecode.enhance.spi.CollectionTracker; import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer; import org.hibernate.collection.spi.PersistentCollection; -import org.hibernate.engine.spi.SelfDirtinessTracker; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.engine.spi.Status; -import org.hibernate.persister.entity.EntityPersister; +import static java.util.Collections.emptySet; import static org.hibernate.engine.internal.ManagedTypeHelper.asSelfDirtinessTracker; import static org.hibernate.engine.internal.ManagedTypeHelper.isSelfDirtinessTracker; @@ -27,7 +25,9 @@ * @author Luis Barreiro * @author Steve Ebersole */ -public class LazyAttributeLoadingInterceptor extends AbstractInterceptor implements BytecodeLazyAttributeInterceptor { +public class LazyAttributeLoadingInterceptor + extends AbstractInterceptor + implements BytecodeLazyAttributeInterceptor { private final Object identifier; private EntityRelatedState entityMeta; @@ -55,7 +55,7 @@ public Object getIdentifier() { @Override protected Object handleRead(Object target, String attributeName, Object value) { if ( !isAttributeLoaded( attributeName ) ) { - Object loadedValue = fetchAttribute( target, attributeName ); + final Object loadedValue = fetchAttribute( target, attributeName ); attributeInitialized( attributeName ); return loadedValue; } @@ -79,9 +79,9 @@ protected Object loadAttribute(final Object target, final String attributeName) return EnhancementHelper.performWork( this, (session, isTemporarySession) -> { - final EntityPersister persister = session.getFactory() - .getMappingMetamodel() - .getEntityDescriptor( getEntityName() ); + final var persister = + session.getFactory().getMappingMetamodel() + .getEntityDescriptor( getEntityName() ); if ( isTemporarySession ) { final Object id = persister.getIdentifier( target, session ); @@ -105,12 +105,9 @@ protected Object loadAttribute(final Object target, final String attributeName) ); } - final LazyPropertyInitializer initializer = (LazyPropertyInitializer) persister; - final Object loadedValue = initializer.initializeLazyProperty( - attributeName, - target, - session - ); + final var initializer = (LazyPropertyInitializer) persister; + final Object loadedValue = + initializer.initializeLazyProperty( attributeName, target, session ); takeCollectionSizeSnapshot( target, attributeName, loadedValue ); return loadedValue; @@ -136,36 +133,30 @@ public boolean hasAnyUninitializedAttributes() { if ( entityMeta.lazyFields.isEmpty() ) { return false; } - - if ( initializedLazyFields == null ) { + else if ( initializedLazyFields == null ) { return true; } - - for ( String fieldName : entityMeta.lazyFields ) { - if ( !initializedLazyFields.contains( fieldName ) ) { - return true; + else { + for ( String fieldName : entityMeta.lazyFields ) { + if ( !initializedLazyFields.contains( fieldName ) ) { + return true; + } } + return false; } - - return false; } @Override public String toString() { - return getClass().getSimpleName() + "(entityName=" + getEntityName() + " ,lazyFields=" + entityMeta.lazyFields + ')'; + return getClass().getSimpleName() + + "(entityName=" + getEntityName() + " ,lazyFields=" + entityMeta.lazyFields + ')'; } private void takeCollectionSizeSnapshot(Object target, String fieldName, Object value) { if ( value instanceof Collection collection && isSelfDirtinessTracker( target ) ) { // This must be called first, so that we remember that there is a collection out there, // even if we don't know its size (see below). - final SelfDirtinessTracker targetSDT = asSelfDirtinessTracker( target ); - CollectionTracker tracker = targetSDT.$$_hibernate_getCollectionTracker(); - if ( tracker == null ) { - targetSDT.$$_hibernate_clearDirtyAttributes(); - tracker = targetSDT.$$_hibernate_getCollectionTracker(); - } - + var tracker = getCollectionTracker( target ); if ( value instanceof PersistentCollection persistentCollection && !persistentCollection.wasInitialized() ) { // Cannot take a snapshot of an uninitialized collection. @@ -175,20 +166,31 @@ private void takeCollectionSizeSnapshot(Object target, String fieldName, Object } } + private static CollectionTracker getCollectionTracker(Object target) { + final var selfDirtinessTracker = asSelfDirtinessTracker( target ); + final var tracker = selfDirtinessTracker.$$_hibernate_getCollectionTracker(); + if ( tracker == null ) { + selfDirtinessTracker.$$_hibernate_clearDirtyAttributes(); + return selfDirtinessTracker.$$_hibernate_getCollectionTracker(); + } + else { + return tracker; + } + } + @Override public void attributeInitialized(String name) { - if ( !isLazyAttribute( name ) ) { - return; - } - if ( initializedLazyFields == null ) { - initializedLazyFields = new HashSet<>(); + if ( isLazyAttribute( name ) ) { + if ( initializedLazyFields == null ) { + initializedLazyFields = new HashSet<>(); + } + initializedLazyFields.add( name ); } - initializedLazyFields.add( name ); } @Override public Set getInitializedLazyAttributeNames() { - return initializedLazyFields == null ? Collections.emptySet() : initializedLazyFields; + return initializedLazyFields == null ? emptySet() : initializedLazyFields; } public void addLazyFieldByGraph(String fieldName) { diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/LazyAttributesMetadata.java b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/LazyAttributesMetadata.java index fe8a4c15ef18..8926fdefbddc 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/LazyAttributesMetadata.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/LazyAttributesMetadata.java @@ -48,7 +48,7 @@ public static LazyAttributesMetadata from( property, isEnhanced, entityName -> { - final PersistentClass entityBinding = metadata.getEntityBinding( entityName ); + final var entityBinding = metadata.getEntityBinding( entityName ); assert entityBinding != null; return entityBinding.hasSubclasses(); }, @@ -58,7 +58,7 @@ public static LazyAttributesMetadata from( final var lazyAttributeDescriptor = LazyAttributeDescriptor.from( property, i, x++ ); lazyAttributeDescriptorMap.put( lazyAttributeDescriptor.getName(), lazyAttributeDescriptor ); - final Set attributeSet = fetchGroupToAttributesMap.computeIfAbsent( + final var attributeSet = fetchGroupToAttributesMap.computeIfAbsent( lazyAttributeDescriptor.getFetchGroupName(), k -> new LinkedHashSet<>() ); @@ -143,8 +143,9 @@ public Set getAttributesInFetchGroup(String fetchGroupName) { } public List getFetchGroupAttributeDescriptors(String groupName) { - final List list = new ArrayList<>(); - for ( String attributeName : fetchGroupToAttributeMap.get( groupName ) ) { + final var attributeNames = fetchGroupToAttributeMap.get( groupName ); + final List list = new ArrayList<>( attributeNames.size() ); + for ( String attributeName : attributeNames ) { list.add( lazyAttributeDescriptorMap.get( attributeName ) ); } return list; diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/SessionAssociationMarkers.java b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/SessionAssociationMarkers.java index 39e2428e4d51..8b9c8ed82318 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/SessionAssociationMarkers.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/SessionAssociationMarkers.java @@ -22,15 +22,11 @@ public final class SessionAssociationMarkers { transient SharedSessionContractImplementor session; //TODO by resetting this one field on Session#close we might be able to avoid iterating on all managed instances to de-associate them? Only if we guarantee all managed types use this. public SessionAssociationMarkers(final SharedSessionContractImplementor session) { - this.allowLoadOutsideTransaction = session.getFactory().getSessionFactoryOptions() - .isInitializeLazyStateOutsideTransactionsEnabled(); - if ( this.allowLoadOutsideTransaction ) { - this.sessionFactoryUuid = session.getFactory().getUuid(); - } - else { - this.sessionFactoryUuid = null; - } this.session = session; + allowLoadOutsideTransaction = + session.getFactory().getSessionFactoryOptions() + .isInitializeLazyStateOutsideTransactionsEnabled(); + sessionFactoryUuid = allowLoadOutsideTransaction ? session.getFactory().getUuid() : null; } /** @@ -38,30 +34,28 @@ public SessionAssociationMarkers(final SharedSessionContractImplementor session) * state. */ private SessionAssociationMarkers() { - this.allowLoadOutsideTransaction = false; - this.sessionFactoryUuid = null; - this.session = null; + session = null; + sessionFactoryUuid = null; + allowLoadOutsideTransaction = false; } /** * Copying constructor for when we're allowed to load outside of transactions * and need to transparently reassociated to the SessionFactory having the * specified UUID. - * @param sessionFactoryUuid + * + * @param uuid The UUID of the SessionFactory */ - private SessionAssociationMarkers(String sessionFactoryUuid) { - this.allowLoadOutsideTransaction = true; - this.sessionFactoryUuid = sessionFactoryUuid; - this.session = null; + private SessionAssociationMarkers(String uuid) { + session = null; + sessionFactoryUuid = uuid; + allowLoadOutsideTransaction = true; } public SessionAssociationMarkers deAssociatedCopy() { - if ( allowLoadOutsideTransaction ) { - return new SessionAssociationMarkers( sessionFactoryUuid ); - } - else { - return NON_ASSOCIATED; - } + return allowLoadOutsideTransaction + ? new SessionAssociationMarkers( sessionFactoryUuid ) + : NON_ASSOCIATED; } /** @@ -70,7 +64,7 @@ public SessionAssociationMarkers deAssociatedCopy() { * Removes the reference to the session; useful on Session close. */ public void sessionClosed() { - this.session = null; + session = null; } } From 5ee2871f5157891c8261c8db4493fc9a62a3c5ac Mon Sep 17 00:00:00 2001 From: Gavin King Date: Mon, 17 Nov 2025 18:26:44 +0100 Subject: [PATCH 4/4] minor code change to EntityEntryContext --- .../engine/internal/EntityEntryContext.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/engine/internal/EntityEntryContext.java b/hibernate-core/src/main/java/org/hibernate/engine/internal/EntityEntryContext.java index 14f977b6a178..535836d0a35e 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/internal/EntityEntryContext.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/internal/EntityEntryContext.java @@ -208,20 +208,20 @@ private void putImmutableManagedEntity(ManagedEntity managed, int instanceId, Im private void checkNotAssociatedWithOtherPersistenceContextIfMutable(ManagedEntity managedEntity) { // we only have to check mutable managedEntity final var entityEntry = (EntityEntryImpl) managedEntity.$$_hibernate_getEntityEntry(); - if ( entityEntry != null - && entityEntry.getPersister().isMutable() - && entityEntry.getPersistenceContext() != null - && entityEntry.getPersistenceContext() != persistenceContext ) { - if ( entityEntry.getPersistenceContext().getSession().isOpen() ) { - // NOTE: otherPersistenceContext may be operating on the entityEntry in a different thread. - // it is not safe to associate entityEntry with this EntityEntryContext. - throw new HibernateException( - "Illegal attempt to associate a ManagedEntity with two open persistence contexts: " + entityEntry - ); - } - else { - // otherPersistenceContext is associated with a closed PersistenceContext - CORE_LOGGER.stalePersistenceContextInEntityEntry( entityEntry.toString() ); + if ( entityEntry != null && entityEntry.getPersister().isMutable() ) { + final var entryPersistenceContext = entityEntry.getPersistenceContext(); + if ( entryPersistenceContext != null && entryPersistenceContext != persistenceContext ) { + if ( entryPersistenceContext.getSession().isOpen() ) { + // NOTE: otherPersistenceContext may be operating on the entityEntry in a different thread. + // it is not safe to associate entityEntry with this EntityEntryContext. + throw new HibernateException( + "Illegal attempt to associate a ManagedEntity with two open persistence contexts: " + entityEntry + ); + } + else { + // otherPersistenceContext is associated with a closed PersistenceContext + CORE_LOGGER.stalePersistenceContextInEntityEntry( entityEntry.toString() ); + } } } }