diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java index 686879c863d3..f59777d834fa 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java @@ -44,7 +44,6 @@ import org.hibernate.cache.internal.StandardTimestampsCacheFactory; import org.hibernate.cache.spi.RegionFactory; import org.hibernate.cache.spi.TimestampsCacheFactory; -import org.hibernate.cfg.AvailableSettings; import org.hibernate.context.spi.CurrentTenantIdentifierResolver; import org.hibernate.dialect.Dialect; import org.hibernate.engine.config.spi.ConfigurationService; @@ -53,7 +52,6 @@ import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.id.uuid.LocalObjectUuidHelper; import org.hibernate.internal.BaselineSessionEventsListenerBuilder; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.internal.EmptyInterceptor; import org.hibernate.internal.util.NullnessHelper; import org.hibernate.internal.util.config.ConfigurationHelper; @@ -87,22 +85,8 @@ import static java.util.Collections.unmodifiableMap; import static org.hibernate.Timeouts.WAIT_FOREVER_MILLI; import static org.hibernate.cfg.AvailableSettings.*; -import static org.hibernate.cfg.AvailableSettings.JAKARTA_LOCK_SCOPE; -import static org.hibernate.cfg.AvailableSettings.JAKARTA_LOCK_TIMEOUT; -import static org.hibernate.cfg.AvailableSettings.JPA_LOCK_TIMEOUT; -import static org.hibernate.cfg.CacheSettings.JAKARTA_SHARED_CACHE_RETRIEVE_MODE; -import static org.hibernate.cfg.CacheSettings.JAKARTA_SHARED_CACHE_STORE_MODE; -import static org.hibernate.cfg.CacheSettings.JPA_SHARED_CACHE_RETRIEVE_MODE; -import static org.hibernate.cfg.CacheSettings.JPA_SHARED_CACHE_STORE_MODE; -import static org.hibernate.cfg.CacheSettings.QUERY_CACHE_LAYOUT; import static org.hibernate.cfg.DialectSpecificSettings.ORACLE_OSON_DISABLED; -import static org.hibernate.cfg.PersistenceSettings.UNOWNED_ASSOCIATION_TRANSIENT_CHECK; -import static org.hibernate.cfg.QuerySettings.DEFAULT_NULL_ORDERING; -import static org.hibernate.cfg.QuerySettings.JSON_FUNCTIONS_ENABLED; -import static org.hibernate.cfg.QuerySettings.PORTABLE_INTEGER_DIVISION; -import static org.hibernate.cfg.QuerySettings.XML_FUNCTIONS_ENABLED; import static org.hibernate.engine.config.spi.StandardConverters.BOOLEAN; -import static org.hibernate.internal.CoreLogging.messageLogger; import static org.hibernate.internal.LockOptionsHelper.applyPropertiesToLockOptions; import static org.hibernate.internal.log.DeprecationLogger.DEPRECATION_LOGGER; import static org.hibernate.internal.util.PropertiesHelper.map; @@ -131,7 +115,6 @@ * @author Steve Ebersole */ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { - private static final CoreMessageLogger log = messageLogger( SessionFactoryOptionsBuilder.class ); private final String uuid = LocalObjectUuidHelper.generateLocalObjectUuid(); private final StandardServiceRegistry serviceRegistry; @@ -291,35 +274,34 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo settings.putAll( configurationService.getSettings() ); beanManagerReference = NullnessHelper.coalesceSuppliedValues( - () -> settings.get( AvailableSettings.JAKARTA_CDI_BEAN_MANAGER ), + () -> settings.get( JAKARTA_CDI_BEAN_MANAGER ), () -> { - final Object value = settings.get( AvailableSettings.CDI_BEAN_MANAGER ); + final Object value = settings.get( CDI_BEAN_MANAGER ); if ( value != null ) { - DEPRECATION_LOGGER.deprecatedSetting( - AvailableSettings.CDI_BEAN_MANAGER, - AvailableSettings.JAKARTA_CDI_BEAN_MANAGER - ); + DEPRECATION_LOGGER.deprecatedSetting( CDI_BEAN_MANAGER, + JAKARTA_CDI_BEAN_MANAGER ); } return value; } ); validatorFactoryReference = settings.getOrDefault( - AvailableSettings.JPA_VALIDATION_FACTORY, - settings.get( AvailableSettings.JAKARTA_VALIDATION_FACTORY ) + JPA_VALIDATION_FACTORY, + settings.get( JAKARTA_VALIDATION_FACTORY ) ); jsonFormatMapper = jsonFormatMapper( - settings.get( AvailableSettings.JSON_FORMAT_MAPPER ), - !getBoolean( ORACLE_OSON_DISABLED ,settings), + settings.get( JSON_FORMAT_MAPPER ), + !getBoolean( ORACLE_OSON_DISABLED, settings), strategySelector ); xmlFormatMapper = xmlFormatMapper( - settings.get( AvailableSettings.XML_FORMAT_MAPPER ), + settings.get( XML_FORMAT_MAPPER ), strategySelector, xmlFormatMapperLegacyFormatEnabled = - context.getMetadataBuildingOptions().isXmlFormatMapperLegacyFormatEnabled() + context.getMetadataBuildingOptions() + .isXmlFormatMapperLegacyFormatEnabled() ); sessionFactoryName = (String) settings.get( SESSION_FACTORY_NAME ); @@ -395,19 +377,19 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo jtaTrackByThread = configurationService.getSetting( JTA_TRACK_BY_THREAD, BOOLEAN, true ); final String hqlTranslatorImplFqn = - extractPropertyValue( AvailableSettings.SEMANTIC_QUERY_PRODUCER, settings ); + extractPropertyValue( SEMANTIC_QUERY_PRODUCER, settings ); hqlTranslator = resolveHqlTranslator( hqlTranslatorImplFqn, serviceRegistry, strategySelector ); final String sqmTranslatorFactoryImplFqn = - extractPropertyValue( AvailableSettings.SEMANTIC_QUERY_TRANSLATOR, settings ); + extractPropertyValue( SEMANTIC_QUERY_TRANSLATOR, settings ); sqmTranslatorFactory = resolveSqmTranslator( sqmTranslatorFactoryImplFqn, strategySelector ); final String sqmMutationStrategyImplName = - extractPropertyValue( AvailableSettings.QUERY_MULTI_TABLE_MUTATION_STRATEGY, settings ); + extractPropertyValue( QUERY_MULTI_TABLE_MUTATION_STRATEGY, settings ); sqmMultiTableMutationStrategy = resolveSqmMutationStrategy( sqmMutationStrategyImplName, serviceRegistry, strategySelector ); final String sqmInsertStrategyImplName = - extractPropertyValue( AvailableSettings.QUERY_MULTI_TABLE_INSERT_STRATEGY, settings ); + extractPropertyValue( QUERY_MULTI_TABLE_INSERT_STRATEGY, settings ); sqmMultiTableInsertStrategy = resolveSqmInsertStrategy( sqmInsertStrategyImplName, serviceRegistry, strategySelector ); @@ -461,25 +443,18 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo autoEvictCollectionCache = false; } - // deprecated + // deprecated, delete this: try { - schemaAutoTooling = SchemaAutoTooling.interpret( (String) settings.get( AvailableSettings.HBM2DDL_AUTO ) ); + schemaAutoTooling = SchemaAutoTooling.interpret( (String) settings.get( HBM2DDL_AUTO ) ); } catch (Exception e) { - log.warn( e.getMessage() + " Ignoring" ); + // ignore, since this member is deprecated and ignored } + final var meta = jdbcServices.getExtractedMetaDataSupport(); + // deprecated - final ExtractedDatabaseMetaData meta = jdbcServices.getExtractedMetaDataSupport(); - if ( meta.doesDataDefinitionCauseTransactionCommit() ) { - tempTableDdlTransactionHandling = - meta.supportsDataDefinitionInTransaction() - ? TempTableDdlTransactionHandling.ISOLATE_AND_TRANSACT - : TempTableDdlTransactionHandling.ISOLATE; - } - else { - tempTableDdlTransactionHandling = TempTableDdlTransactionHandling.NONE; - } + tempTableDdlTransactionHandling = getTempTableDdlTransactionHandling( meta ); jdbcBatchSize = disallowBatchUpdates( dialect, meta ) ? 0 : getInt( STATEMENT_BATCH_SIZE, settings, 1 ); @@ -494,7 +469,7 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo connectionHandlingMode = interpretConnectionHandlingMode( settings, serviceRegistry ); connectionProviderDisablesAutoCommit = - getBoolean( AvailableSettings.CONNECTION_PROVIDER_DISABLES_AUTOCOMMIT, settings, false ); + getBoolean( CONNECTION_PROVIDER_DISABLES_AUTOCOMMIT, settings, false ); commentsEnabled = getBoolean( USE_SQL_COMMENTS, settings ); @@ -510,11 +485,11 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo jdbcTimeZone = getJdbcTimeZone( settings.get( JDBC_TIME_ZONE ) ); criteriaValueHandlingMode = ValueHandlingMode.interpret( settings.get( CRITERIA_VALUE_HANDLING_MODE ) ); - criteriaCopyTreeEnabled = getBoolean( AvailableSettings.CRITERIA_COPY_TREE, settings, jpaBootstrap ); - criteriaPlanCacheEnabled = getBoolean( AvailableSettings.CRITERIA_PLAN_CACHE_ENABLED, settings, false ); + criteriaCopyTreeEnabled = getBoolean( CRITERIA_COPY_TREE, settings, jpaBootstrap ); + criteriaPlanCacheEnabled = getBoolean( CRITERIA_PLAN_CACHE_ENABLED, settings, false ); nativeJdbcParametersIgnored = - getBoolean( AvailableSettings.NATIVE_IGNORE_JDBC_PARAMETERS, settings, false ); + getBoolean( NATIVE_IGNORE_JDBC_PARAMETERS, settings, false ); // added the boolean parameter in case we want to define some form of "all" as discussed jpaCompliance = context.getJpaCompliance(); @@ -542,10 +517,10 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo getBoolean( UNOWNED_ASSOCIATION_TRANSIENT_CHECK, settings, isJpaBootstrap() ); passProcedureParameterNames = - getBoolean( AvailableSettings.QUERY_PASS_PROCEDURE_PARAMETER_NAMES, settings, false ); + getBoolean( QUERY_PASS_PROCEDURE_PARAMETER_NAMES, settings, false ); preferJdbcDatetimeTypes = - getBoolean( AvailableSettings.NATIVE_PREFER_JDBC_DATETIME_TYPES, settings, false ); + getBoolean( NATIVE_PREFER_JDBC_DATETIME_TYPES, settings, false ); defaultSessionProperties = initializeDefaultSessionProperties( configurationService ); @@ -557,6 +532,18 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo initialSessionFlushMode = defaultFlushMode( defaultSessionProperties ); } + @Deprecated(forRemoval = true) + private static TempTableDdlTransactionHandling getTempTableDdlTransactionHandling(ExtractedDatabaseMetaData meta) { + if ( meta.doesDataDefinitionCauseTransactionCommit() ) { + return meta.supportsDataDefinitionInTransaction() + ? TempTableDdlTransactionHandling.ISOLATE_AND_TRANSACT + : TempTableDdlTransactionHandling.ISOLATE; + } + else { + return TempTableDdlTransactionHandling.NONE; + } + } + private TimeZone getJdbcTimeZone(Object jdbcTimeZoneValue) { if ( jdbcTimeZoneValue instanceof TimeZone timeZone ) { return timeZone; diff --git a/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesHelper.java b/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesHelper.java index 1e7ac3aa8fc2..ac2fb45410c1 100644 --- a/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesHelper.java @@ -8,7 +8,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import org.hibernate.HibernateException; @@ -30,15 +29,12 @@ import org.hibernate.metamodel.mapping.ModelPart; import org.hibernate.metamodel.mapping.SelectableMapping; import org.hibernate.persister.entity.EntityPersister; -import org.hibernate.persister.entity.mutation.EntityTableMapping; import org.hibernate.query.results.internal.TableGroupImpl; import org.hibernate.query.spi.QueryOptions; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.tree.from.NamedTableReference; import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.sql.exec.internal.BaseExecutionContext; -import org.hibernate.sql.exec.spi.ExecutionContext; -import org.hibernate.sql.model.MutationType; import org.hibernate.sql.model.TableMapping; import org.hibernate.sql.results.internal.ResultsHelper; import org.hibernate.sql.results.internal.RowProcessingStateStandardImpl; @@ -48,12 +44,15 @@ import org.hibernate.sql.results.jdbc.internal.JdbcValuesSourceProcessingStateStandardImpl; import org.hibernate.sql.results.jdbc.spi.JdbcValues; import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducer; -import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingOptions; import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.sql.results.spi.RowReader; +import static java.util.Collections.unmodifiableList; import static org.hibernate.internal.NaturalIdHelper.getNaturalIdPropertyNames; import static org.hibernate.pretty.MessageHelper.infoString; +import static org.hibernate.sql.model.MutationType.INSERT; +import static org.hibernate.sql.model.MutationType.UPDATE; +import static org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingOptions.NO_OPTIONS; /** * Factory and helper methods for {@link GeneratedValuesMutationDelegate} framework. @@ -65,7 +64,7 @@ public class GeneratedValuesHelper { private static final CoreMessageLogger LOG = CoreLogging.messageLogger( IdentifierGeneratorHelper.class ); /** - * Reads the {@link EntityPersister#getGeneratedProperties(EventType) generated values} + * Reads the {@linkplain EntityPersister#getGeneratedProperties(EventType) generated values} * for the specified {@link ResultSet}. * * @param resultSet The result set from which to extract the generated values @@ -87,19 +86,18 @@ public static GeneratedValues getGeneratedValues( return null; } - final GeneratedValuesMutationDelegate delegate = persister.getMutationDelegate( - timing == EventType.INSERT ? MutationType.INSERT : MutationType.UPDATE - ); - final GeneratedValuesMappingProducer mappingProducer = - (GeneratedValuesMappingProducer) delegate.getGeneratedValuesMappingProducer(); - final List resultBuilders = mappingProducer.getResultBuilders(); + final var mappingProducer = + (GeneratedValuesMappingProducer) + persister.getMutationDelegate( timing == EventType.INSERT ? INSERT : UPDATE ) + .getGeneratedValuesMappingProducer(); + final var resultBuilders = mappingProducer.getResultBuilders(); final List generatedProperties = new ArrayList<>( resultBuilders.size() ); - for ( GeneratedValueBasicResultBuilder resultBuilder : resultBuilders ) { + for ( var resultBuilder : resultBuilders ) { generatedProperties.add( resultBuilder.getModelPart() ); } - final GeneratedValuesImpl generatedValues = new GeneratedValuesImpl( generatedProperties ); - final Object[] results = readGeneratedValues( resultSet, statement, persister, mappingProducer, session ); + final var generatedValues = new GeneratedValuesImpl( generatedProperties ); + final var results = readGeneratedValues( resultSet, statement, persister, mappingProducer, session ); if ( LOG.isDebugEnabled() ) { LOG.debug( "Extracted generated values for entity " @@ -130,84 +128,38 @@ private static Object[] readGeneratedValues( EntityPersister persister, JdbcValuesMappingProducer mappingProducer, SharedSessionContractImplementor session) { - final ExecutionContext executionContext = new BaseExecutionContext( session ); - - final DirectResultSetAccess directResultSetAccess = new DirectResultSetAccess( - session, - statement, - resultSet - ); - + final var factory = session.getFactory(); + final var executionContext = new BaseExecutionContext( session ); + final var directResultSetAccess = + new DirectResultSetAccess( session, statement, resultSet ); + final var influencers = session.getLoadQueryInfluencers(); final JdbcValues jdbcValues = new JdbcValuesResultSetImpl( directResultSetAccess, null, null, QueryOptions.NONE, true, - mappingProducer.resolve( - directResultSetAccess, - session.getLoadQueryInfluencers(), - session.getSessionFactory() - ), + mappingProducer.resolve( directResultSetAccess, influencers, factory ), null, executionContext ); - - final JdbcValuesSourceProcessingOptions processingOptions = new JdbcValuesSourceProcessingOptions() { - @Override - public Object getEffectiveOptionalObject() { - return null; - } - - @Override - public String getEffectiveOptionalEntityName() { - return null; - } - - @Override - public Object getEffectiveOptionalId() { - return null; - } - - @Override - public boolean shouldReturnProxies() { - return true; - } - }; - - final JdbcValuesSourceProcessingStateStandardImpl valuesProcessingState = - new JdbcValuesSourceProcessingStateStandardImpl( executionContext, processingOptions ); - + final var valuesProcessingState = + new JdbcValuesSourceProcessingStateStandardImpl( executionContext, NO_OPTIONS ); final RowReader rowReader = ResultsHelper.createRowReader( - session.getFactory(), + factory, RowTransformerArrayImpl.instance(), Object[].class, jdbcValues ); - - final RowProcessingStateStandardImpl rowProcessingState = new RowProcessingStateStandardImpl( - valuesProcessingState, - executionContext, - rowReader, - jdbcValues - ); - - final List results = ListResultsConsumer.instance( ListResultsConsumer.UniqueSemantic.NONE ) - .consume( - jdbcValues, - session, - processingOptions, - valuesProcessingState, - rowProcessingState, - rowReader - ); - + final var rowProcessingState = + new RowProcessingStateStandardImpl( valuesProcessingState, executionContext, rowReader, jdbcValues ); + final List results = + ListResultsConsumer.instance( ListResultsConsumer.UniqueSemantic.NONE ) + .consume( jdbcValues, session, NO_OPTIONS, valuesProcessingState, rowProcessingState, rowReader ); if ( results.isEmpty() ) { - throw new HibernateException( - "The database returned no natively generated values : " + persister.getNavigableRole().getFullPath() - ); + throw new HibernateException( "The database returned no natively generated values : " + + persister.getNavigableRole().getFullPath() ); } - return results.get( 0 ); } @@ -228,8 +180,16 @@ public static GeneratedValuesMappingProducer createMappingProducer( EventType timing, boolean supportsArbitraryValues, boolean supportsRowId) { - // This is just a mock table group needed to correctly resolve expressions + return generatedValuesMappingProducer( persister, supportsArbitraryValues, + getActualGeneratedModelParts( persister, timing, supportsArbitraryValues, supportsRowId ) ); + } + + private static GeneratedValuesMappingProducer generatedValuesMappingProducer( + EntityPersister persister, + boolean supportsArbitraryValues, + List generatedProperties) { final NavigablePath parentNavigablePath = new NavigablePath( persister.getEntityName() ); + // This is just a mock table group needed to correctly resolve expressions final TableGroup tableGroup = new TableGroupImpl( parentNavigablePath, null, @@ -237,24 +197,17 @@ public static GeneratedValuesMappingProducer createMappingProducer( persister ); // Create the mapping producer and add all result builders to it - final List generatedProperties = getActualGeneratedModelParts( - persister, - timing, - supportsArbitraryValues, - supportsRowId - ); - final GeneratedValuesMappingProducer mappingProducer = new GeneratedValuesMappingProducer(); + final var mappingProducer = new GeneratedValuesMappingProducer(); for ( int i = 0; i < generatedProperties.size(); i++ ) { - final ModelPart modelPart = generatedProperties.get( i ); - final BasicValuedModelPart basicModelPart = modelPart.asBasicValuedModelPart(); + final var modelPart = generatedProperties.get( i ); + final var basicModelPart = modelPart.asBasicValuedModelPart(); if ( basicModelPart != null ) { - final GeneratedValueBasicResultBuilder resultBuilder = new GeneratedValueBasicResultBuilder( + mappingProducer.addResultBuilder( new GeneratedValueBasicResultBuilder( parentNavigablePath.append( basicModelPart.getSelectableName() ), basicModelPart, tableGroup, supportsArbitraryValues ? i : null - ); - mappingProducer.addResultBuilder( resultBuilder ); + ) ); } else { throw new UnsupportedOperationException( "Unsupported generated ModelPart: " + modelPart.getPartName() ); @@ -266,12 +219,12 @@ public static GeneratedValuesMappingProducer createMappingProducer( public static BasicValuedModelPart getActualGeneratedModelPart(BasicValuedModelPart modelPart) { // Use the root entity descriptor's identifier mapping to get the correct selection // expression since we always retrieve generated values for the root table only - return modelPart.isEntityIdentifierMapping() ? - modelPart.findContainingEntityMapping() + return modelPart.isEntityIdentifierMapping() + ? modelPart.findContainingEntityMapping() .getRootEntityDescriptor() .getIdentifierMapping() - .asBasicValuedModelPart() : - modelPart; + .asBasicValuedModelPart() + : modelPart; } /** @@ -284,14 +237,16 @@ private static List getActualGeneratedModelParts( boolean supportsArbitraryValues, boolean supportsRowId) { if ( timing == EventType.INSERT ) { - final List generatedProperties = supportsArbitraryValues ? - persister.getInsertGeneratedProperties() : - List.of( persister.getIdentifierMapping() ); + final var generatedProperties = + supportsArbitraryValues + ? persister.getInsertGeneratedProperties() + : List.of( persister.getIdentifierMapping() ); if ( persister.getRowIdMapping() != null && supportsRowId ) { - final List newList = new ArrayList<>( generatedProperties.size() + 1 ); + final List newList = + new ArrayList<>( generatedProperties.size() + 1 ); newList.addAll( generatedProperties ); newList.add( persister.getRowIdMapping() ); - return Collections.unmodifiableList( newList ); + return unmodifiableList( newList ); } else { return generatedProperties; @@ -313,53 +268,55 @@ private static List getActualGeneratedModelParts( public static GeneratedValuesMutationDelegate getGeneratedValuesDelegate( EntityPersister persister, EventType timing) { - final List generatedProperties = persister.getGeneratedProperties( timing ); - final boolean hasGeneratedProperties = !generatedProperties.isEmpty(); + final var factory = persister.getFactory(); + final var generatedProperties = persister.getGeneratedProperties( timing ); final boolean hasFormula = generatedProperties.stream() - .anyMatch( part -> part instanceof SelectableMapping selectable && selectable.isFormula() ); - final boolean hasRowId = timing == EventType.INSERT && persister.getRowIdMapping() != null; - final Dialect dialect = persister.getFactory().getJdbcServices().getDialect(); - - if ( hasRowId && dialect.supportsInsertReturning() && dialect.supportsInsertReturningRowId() + .anyMatch( part -> part instanceof SelectableMapping selectable + && selectable.isFormula() ); + final boolean hasRowId = + timing == EventType.INSERT + && persister.getRowIdMapping() != null; + final Dialect dialect = factory.getJdbcServices().getDialect(); + if ( hasRowId + && dialect.supportsInsertReturning() + && dialect.supportsInsertReturningRowId() && noCustomSql( persister, timing ) ) { // Special case for RowId on INSERT, since GetGeneratedKeysDelegate doesn't support it // make InsertReturningDelegate the preferred method if the dialect supports it return new InsertReturningDelegate( persister, timing ); } - - if ( !hasGeneratedProperties ) { + else if ( generatedProperties.isEmpty() ) { return null; } - - if ( !hasFormula + else if ( !hasFormula && dialect.supportsInsertReturningGeneratedKeys() - && persister.getFactory().getSessionFactoryOptions().isGetGeneratedKeysEnabled() ) { + && factory.getSessionFactoryOptions().isGetGeneratedKeysEnabled() ) { return new GetGeneratedKeysDelegate( persister, false, timing ); } else if ( supportsReturning( dialect, timing ) && noCustomSql( persister, timing ) ) { return new InsertReturningDelegate( persister, timing ); } - else if ( timing == EventType.INSERT && persister.getNaturalIdentifierProperties() != null - && !persister.getEntityMetamodel().isNaturalIdentifierInsertGenerated() ) { - return new UniqueKeySelectingDelegate( - persister, - getNaturalIdPropertyNames( persister ), - timing - ); + else if ( timing == EventType.INSERT + && persister.getNaturalIdentifierProperties() != null + && !persister.getEntityMetamodel().isNaturalIdentifierInsertGenerated() ) { + return new UniqueKeySelectingDelegate( persister, getNaturalIdPropertyNames( persister ), timing ); } return null; } private static boolean supportsReturning(Dialect dialect, EventType timing) { - return timing == EventType.INSERT ? dialect.supportsInsertReturning() : dialect.supportsUpdateReturning(); + return timing == EventType.INSERT + ? dialect.supportsInsertReturning() + : dialect.supportsUpdateReturning(); } public static boolean noCustomSql(EntityPersister persister, EventType timing) { - final EntityTableMapping identifierTable = persister.getIdentifierTableMapping(); - final TableMapping.MutationDetails mutationDetails = timing == EventType.INSERT ? - identifierTable.getInsertDetails() : - identifierTable.getUpdateDetails(); + final var identifierTable = persister.getIdentifierTableMapping(); + final TableMapping.MutationDetails mutationDetails = + timing == EventType.INSERT + ? identifierTable.getInsertDetails() + : identifierTable.getUpdateDetails(); return mutationDetails.getCustomSql() == null; } } diff --git a/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesImpl.java b/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesImpl.java index e2900cd7383b..9f18dc6060ad 100644 --- a/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesImpl.java @@ -5,15 +5,16 @@ package org.hibernate.generator.values.internal; import java.util.ArrayList; -import java.util.Collections; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import org.hibernate.generator.values.GeneratedValues; -import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.metamodel.mapping.ModelPart; +import static java.util.Collections.emptyList; +import static org.hibernate.internal.util.collections.CollectionHelper.isEmpty; + /** * Standard implementation for {@link GeneratedValues} using {@link IdentityHashMap}. * @@ -38,8 +39,8 @@ public Object getGeneratedValue(ModelPart modelPart) { @Override public List getGeneratedValues(List modelParts) { - if ( CollectionHelper.isEmpty( modelParts ) ) { - return Collections.emptyList(); + if ( isEmpty( modelParts ) ) { + return emptyList(); } final List generatedValues = new ArrayList<>( modelParts.size() ); diff --git a/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesMappingProducer.java b/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesMappingProducer.java index 177c834f1fdb..2b9e7f003765 100644 --- a/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesMappingProducer.java +++ b/hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesMappingProducer.java @@ -14,7 +14,6 @@ import org.hibernate.generator.values.GeneratedValuesMutationDelegate; import org.hibernate.query.results.internal.DomainResultCreationStateImpl; import org.hibernate.query.results.internal.JdbcValuesMappingImpl; -import org.hibernate.query.results.ResultBuilder; import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.jdbc.spi.JdbcValuesMapping; @@ -41,9 +40,8 @@ public JdbcValuesMapping resolve( final int rowSize = jdbcResultsMetadata.getColumnCount(); final List sqlSelections = new ArrayList<>( rowSize ); - final List> domainResults = new ArrayList<>( numberOfResults ); - final DomainResultCreationStateImpl creationState = new DomainResultCreationStateImpl( + final var creationState = new DomainResultCreationStateImpl( null, jdbcResultsMetadata, null, @@ -53,18 +51,14 @@ public JdbcValuesMapping resolve( sessionFactory ); + final List> domainResults = new ArrayList<>( numberOfResults ); for ( int i = 0; i < numberOfResults; i++ ) { - final ResultBuilder resultBuilder = resultBuilders.get( i ); - final DomainResult domainResult = resultBuilder.buildResult( - jdbcResultsMetadata, - domainResults.size(), - creationState - ); - + final var domainResult = + resultBuilders.get( i ) + .buildResult( jdbcResultsMetadata, i, creationState ); if ( domainResult.containsAnyNonScalarResults() ) { creationState.disallowPositionalSelections(); } - domainResults.add( domainResult ); } diff --git a/hibernate-core/src/main/java/org/hibernate/generator/values/internal/TableUpdateReturningBuilder.java b/hibernate-core/src/main/java/org/hibernate/generator/values/internal/TableUpdateReturningBuilder.java index 8474229b54f9..445fbdb6c140 100644 --- a/hibernate-core/src/main/java/org/hibernate/generator/values/internal/TableUpdateReturningBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/generator/values/internal/TableUpdateReturningBuilder.java @@ -9,16 +9,17 @@ import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.sql.ast.tree.expression.ColumnReference; -import org.hibernate.sql.model.MutationOperation; import org.hibernate.sql.model.ast.MutatingTableReference; import org.hibernate.sql.model.ast.RestrictedTableMutation; import org.hibernate.sql.model.ast.builder.AbstractTableUpdateBuilder; import org.hibernate.sql.model.internal.TableUpdateStandard; +import org.hibernate.sql.model.jdbc.JdbcMutationOperation; /** * @author Marco Belladelli */ -public class TableUpdateReturningBuilder extends AbstractTableUpdateBuilder { +public class TableUpdateReturningBuilder + extends AbstractTableUpdateBuilder { final List generatedColumns; public TableUpdateReturningBuilder( @@ -36,9 +37,8 @@ protected EntityPersister getMutationTarget() { } @Override - @SuppressWarnings( "unchecked" ) - public RestrictedTableMutation buildMutation() { - return (RestrictedTableMutation) new TableUpdateStandard( + public RestrictedTableMutation buildMutation() { + return new TableUpdateStandard( getMutatingTable(), getMutationTarget(), getSqlComment(), diff --git a/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractReturningDelegate.java b/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractReturningDelegate.java index 1a3a4ade5673..2f7c3a2503ae 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractReturningDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractReturningDelegate.java @@ -64,7 +64,7 @@ public GeneratedValues performMutation( public final GeneratedValues performInsertReturning(String sql, SharedSessionContractImplementor session, Binder binder) { try { // prepare and execute the insert - PreparedStatement insert = prepareStatement( sql, session ); + final var insert = prepareStatement( sql, session ); try { binder.bindValues( insert ); return executeAndExtractReturning( sql, insert, session ); diff --git a/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractSelectingDelegate.java b/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractSelectingDelegate.java index c76aa5601bbd..a6dbb0f48b7f 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractSelectingDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractSelectingDelegate.java @@ -10,18 +10,15 @@ import org.hibernate.engine.jdbc.mutation.JdbcValueBindings; import org.hibernate.engine.jdbc.mutation.group.PreparedStatementDetails; -import org.hibernate.engine.jdbc.spi.JdbcCoordinator; -import org.hibernate.engine.jdbc.spi.JdbcServices; -import org.hibernate.engine.jdbc.spi.StatementPreparer; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.generator.EventType; import org.hibernate.generator.values.AbstractGeneratedValuesMutationDelegate; import org.hibernate.generator.values.GeneratedValues; import org.hibernate.persister.entity.EntityPersister; -import org.hibernate.pretty.MessageHelper; import static java.sql.Statement.NO_GENERATED_KEYS; import static org.hibernate.generator.values.internal.GeneratedValuesHelper.getGeneratedValues; +import static org.hibernate.pretty.MessageHelper.infoString; /** * Abstract {@link org.hibernate.generator.values.GeneratedValuesMutationDelegate} implementation where @@ -62,7 +59,8 @@ private GeneratedValues extractReturningValues(ResultSet resultSet, PreparedStat @Override public PreparedStatement prepareStatement(String insertSql, SharedSessionContractImplementor session) { - return session.getJdbcCoordinator().getMutationStatementPreparer().prepareStatement( insertSql, NO_GENERATED_KEYS ); + return session.getJdbcCoordinator().getMutationStatementPreparer() + .prepareStatement( insertSql, NO_GENERATED_KEYS ); } @Override @@ -71,8 +69,8 @@ public GeneratedValues performMutation( JdbcValueBindings jdbcValueBindings, Object entity, SharedSessionContractImplementor session) { - final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); - final JdbcServices jdbcServices = session.getJdbcServices(); + final var jdbcCoordinator = session.getJdbcCoordinator(); + final var jdbcServices = session.getJdbcServices(); jdbcServices.getSqlStatementLogger().logStatement( statementDetails.getSqlString() ); @@ -91,11 +89,11 @@ public GeneratedValues performMutation( // the insert is complete, select the generated id... final String idSelectSql = getSelectSQL(); - final PreparedStatement idSelect = jdbcCoordinator.getStatementPreparer().prepareStatement( idSelectSql ); + final var idSelect = jdbcCoordinator.getStatementPreparer().prepareStatement( idSelectSql ); try { bindParameters( entity, idSelect, session ); - final ResultSet resultSet = session.getJdbcCoordinator().getResultSetReturn().extract( idSelect, idSelectSql ); + final ResultSet resultSet = jdbcCoordinator.getResultSetReturn().extract( idSelect, idSelectSql ); try { return extractReturningValues( resultSet, idSelect, session ); } @@ -107,8 +105,8 @@ public GeneratedValues performMutation( ); } finally { - session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( idSelect ); - session.getJdbcCoordinator().afterStatementExecution(); + jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( idSelect ); + jdbcCoordinator.afterStatementExecution(); } } catch (SQLException e) { @@ -122,11 +120,11 @@ public GeneratedValues performMutation( @Override public final GeneratedValues performInsertReturning(String sql, SharedSessionContractImplementor session, Binder binder) { - JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); - StatementPreparer statementPreparer = jdbcCoordinator.getStatementPreparer(); + final var jdbcCoordinator = session.getJdbcCoordinator(); + final var statementPreparer = jdbcCoordinator.getStatementPreparer(); try { // prepare and execute the insert - PreparedStatement insert = statementPreparer.prepareStatement( sql, NO_GENERATED_KEYS ); + final var insert = statementPreparer.prepareStatement( sql, NO_GENERATED_KEYS ); try { binder.bindValues( insert ); jdbcCoordinator.getResultSetReturn().executeUpdate( insert, sql ); @@ -139,7 +137,7 @@ public final GeneratedValues performInsertReturning(String sql, SharedSessionCon catch (SQLException sqle) { throw session.getJdbcServices().getSqlExceptionHelper().convert( sqle, - "could not insert: " + MessageHelper.infoString( persister ), + "could not insert: " + infoString( persister ), sql ); } @@ -148,7 +146,7 @@ public final GeneratedValues performInsertReturning(String sql, SharedSessionCon try { //fetch the generated id in a separate query - final PreparedStatement idSelect = statementPreparer.prepareStatement( selectSQL ); + final var idSelect = statementPreparer.prepareStatement( selectSQL ); try { bindParameters( binder.getEntity(), idSelect, session ); final ResultSet resultSet = jdbcCoordinator.getResultSetReturn().extract( idSelect, selectSQL ); @@ -168,7 +166,7 @@ public final GeneratedValues performInsertReturning(String sql, SharedSessionCon catch (SQLException sqle) { throw session.getJdbcServices().getSqlExceptionHelper().convert( sqle, - "could not retrieve generated id after insert: " + MessageHelper.infoString( persister ), + "could not retrieve generated id after insert: " + infoString( persister ), selectSQL ); } diff --git a/hibernate-core/src/main/java/org/hibernate/id/insert/BasicSelectingDelegate.java b/hibernate-core/src/main/java/org/hibernate/id/insert/BasicSelectingDelegate.java index f64debccb11f..ab4706415ef1 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/insert/BasicSelectingDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/id/insert/BasicSelectingDelegate.java @@ -5,7 +5,6 @@ package org.hibernate.id.insert; import org.hibernate.HibernateException; -import org.hibernate.cfg.AvailableSettings; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.generator.EventType; import org.hibernate.jdbc.Expectation; @@ -13,6 +12,8 @@ import org.hibernate.sql.model.ast.builder.TableInsertBuilderStandard; import org.hibernate.sql.model.ast.builder.TableMutationBuilder; +import static org.hibernate.cfg.AvailableSettings.USE_GET_GENERATED_KEYS; + /** * Delegate for dealing with {@code IDENTITY} columns where the dialect requires an * additional command execution to retrieve the generated {@code IDENTITY} value @@ -38,7 +39,7 @@ protected String getSelectSQL() { if ( identitySelectString == null && !dialect().getIdentityColumnSupport().supportsInsertSelectIdentity() ) { throw new HibernateException( "Cannot retrieve the generated identity, because '" - + AvailableSettings.USE_GET_GENERATED_KEYS + + USE_GET_GENERATED_KEYS + "' was disabled and the dialect does not support selecting the last generated identity" ); } return identitySelectString; diff --git a/hibernate-core/src/main/java/org/hibernate/id/insert/GetGeneratedKeysDelegate.java b/hibernate-core/src/main/java/org/hibernate/id/insert/GetGeneratedKeysDelegate.java index 6ba7d3c69861..eed0b456c69a 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/insert/GetGeneratedKeysDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/id/insert/GetGeneratedKeysDelegate.java @@ -15,11 +15,9 @@ import org.hibernate.engine.jdbc.mutation.group.PreparedStatementDetails; import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.jdbc.spi.JdbcServices; -import org.hibernate.engine.jdbc.spi.MutationStatementPreparer; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.generator.EventType; -import org.hibernate.generator.values.GeneratedValueBasicResultBuilder; import org.hibernate.generator.values.GeneratedValues; import org.hibernate.jdbc.Expectation; import org.hibernate.persister.entity.EntityPersister; @@ -30,6 +28,7 @@ import static java.sql.Statement.RETURN_GENERATED_KEYS; import static org.hibernate.generator.values.internal.GeneratedValuesHelper.getActualGeneratedModelPart; import static org.hibernate.generator.values.internal.GeneratedValuesHelper.getGeneratedValues; +import static org.hibernate.internal.util.StringHelper.EMPTY_STRINGS; import static org.hibernate.internal.util.StringHelper.unquote; /** @@ -53,14 +52,16 @@ public GetGeneratedKeysDelegate( columnNames = null; } else { - final List resultBuilders = jdbcValuesMappingProducer.getResultBuilders(); + final var resultBuilders = jdbcValuesMappingProducer.getResultBuilders(); final List columnNamesList = new ArrayList<>( resultBuilders.size() ); final boolean unquote = dialect().unquoteGetGeneratedKeys(); - for ( GeneratedValueBasicResultBuilder resultBuilder : resultBuilders ) { - final String col = getActualGeneratedModelPart( resultBuilder.getModelPart() ).getSelectionExpression(); - columnNamesList.add( unquote ? unquote( col, dialect() ) : col ); + for ( var resultBuilder : resultBuilders ) { + final String columnName = + getActualGeneratedModelPart( resultBuilder.getModelPart() ) + .getSelectionExpression(); + columnNamesList.add( unquote ? unquote( columnName, dialect() ) : columnName ); } - columnNames = columnNamesList.toArray( new String[0] ); + columnNames = columnNamesList.toArray( EMPTY_STRINGS ); } } @@ -68,17 +69,15 @@ public GetGeneratedKeysDelegate( public TableMutationBuilder createTableMutationBuilder( Expectation expectation, SessionFactoryImplementor factory) { - if ( getTiming() == EventType.INSERT ) { - return new TableInsertBuilderStandard( persister, persister.getIdentifierTableMapping(), factory ); - } - else { - return new TableUpdateBuilderStandard<>( persister, persister.getIdentifierTableMapping(), factory ); - } + final var identifierTableMapping = persister.getIdentifierTableMapping(); + return getTiming() == EventType.INSERT + ? new TableInsertBuilderStandard( persister, identifierTableMapping, factory ) + : new TableUpdateBuilderStandard<>( persister, identifierTableMapping, factory ); } @Override public PreparedStatement prepareStatement(String sql, SharedSessionContractImplementor session) { - MutationStatementPreparer preparer = session.getJdbcCoordinator().getMutationStatementPreparer(); + var preparer = session.getJdbcCoordinator().getMutationStatementPreparer(); return columnNames == null ? preparer.prepareStatement( sql, RETURN_GENERATED_KEYS ) : preparer.prepareStatement( sql, columnNames ); @@ -98,7 +97,7 @@ public GeneratedValues performMutation( jdbcServices.getSqlStatementLogger().logStatement( sql ); try { - final PreparedStatement preparedStatement = statementDetails.resolveStatement(); + final var preparedStatement = statementDetails.resolveStatement(); jdbcValueBindings.beforeStatement( statementDetails ); jdbcCoordinator.getResultSetReturn().executeUpdate( preparedStatement, sql ); @@ -121,9 +120,7 @@ public GeneratedValues performMutation( } finally { if ( resultSet != null ) { - jdbcCoordinator - .getLogicalConnection() - .getResourceRegistry() + jdbcCoordinator.getLogicalConnection().getResourceRegistry() .release( resultSet, preparedStatement ); } } @@ -168,7 +165,8 @@ public GeneratedValues executeAndExtractReturning( } finally { if ( resultSet != null ) { - jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( resultSet, preparedStatement ); + jdbcCoordinator.getLogicalConnection().getResourceRegistry() + .release( resultSet, preparedStatement ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/insert/InsertReturningDelegate.java b/hibernate-core/src/main/java/org/hibernate/id/insert/InsertReturningDelegate.java index 4fdfb799a576..79a2a259244c 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/insert/InsertReturningDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/id/insert/InsertReturningDelegate.java @@ -10,12 +10,9 @@ import java.util.ArrayList; import java.util.List; -import org.hibernate.engine.jdbc.spi.JdbcCoordinator; -import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.generator.EventType; -import org.hibernate.generator.values.GeneratedValueBasicResultBuilder; import org.hibernate.generator.values.GeneratedValues; import org.hibernate.generator.values.GeneratedValuesMutationDelegate; import org.hibernate.generator.values.internal.TableUpdateReturningBuilder; @@ -48,16 +45,15 @@ public InsertReturningDelegate(EntityPersister persister, EventType timing) { persister, timing, true, - persister.getFactory().getJdbcServices().getDialect().supportsInsertReturningRowId() + persister.getFactory().getJdbcServices().getDialect() + .supportsInsertReturningRowId() ); - this.tableReference = new MutatingTableReference( persister.getIdentifierTableMapping() ); - final List resultBuilders = jdbcValuesMappingProducer.getResultBuilders(); - this.generatedColumns = new ArrayList<>( resultBuilders.size() ); - for ( GeneratedValueBasicResultBuilder resultBuilder : resultBuilders ) { - generatedColumns.add( new ColumnReference( - tableReference, - getActualGeneratedModelPart( resultBuilder.getModelPart() ) - ) ); + tableReference = new MutatingTableReference( persister.getIdentifierTableMapping() ); + final var resultBuilders = jdbcValuesMappingProducer.getResultBuilders(); + generatedColumns = new ArrayList<>( resultBuilders.size() ); + for ( var resultBuilder : resultBuilders ) { + generatedColumns.add( new ColumnReference( tableReference, + getActualGeneratedModelPart( resultBuilder.getModelPart() ) ) ); } } @@ -65,12 +61,9 @@ public InsertReturningDelegate(EntityPersister persister, EventType timing) { public TableMutationBuilder createTableMutationBuilder( Expectation expectation, SessionFactoryImplementor sessionFactory) { - if ( getTiming() == EventType.INSERT ) { - return new TableInsertReturningBuilder( persister, tableReference, generatedColumns, sessionFactory ); - } - else { - return new TableUpdateReturningBuilder<>( persister, tableReference, generatedColumns, sessionFactory ); - } + return getTiming() == EventType.INSERT + ? new TableInsertReturningBuilder( persister, tableReference, generatedColumns, sessionFactory ) + : new TableUpdateReturningBuilder( persister, tableReference, generatedColumns, sessionFactory ); } @Override @@ -78,16 +71,15 @@ protected GeneratedValues executeAndExtractReturning( String sql, PreparedStatement preparedStatement, SharedSessionContractImplementor session) { - final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); - final JdbcServices jdbcServices = session.getJdbcServices(); - - final ResultSet resultSet = jdbcCoordinator.getResultSetReturn().execute( preparedStatement, sql ); + final ResultSet resultSet = + session.getJdbcCoordinator().getResultSetReturn() + .execute( preparedStatement, sql ); try { return getGeneratedValues( resultSet, preparedStatement, persister, getTiming(), session ); } - catch (SQLException e) { - throw jdbcServices.getSqlExceptionHelper().convert( - e, + catch (SQLException sqle) { + throw session.getJdbcServices().getSqlExceptionHelper().convert( + sqle, "Unable to extract generated key(s) from generated-keys ResultSet", sql ); @@ -96,14 +88,16 @@ protected GeneratedValues executeAndExtractReturning( @Override public String prepareIdentifierGeneratingInsert(String insertSQL) { - final BasicEntityIdentifierMapping identifierMapping = - (BasicEntityIdentifierMapping) persister.getRootEntityDescriptor().getIdentifierMapping(); + final var identifierMapping = + (BasicEntityIdentifierMapping) + persister.getRootEntityDescriptor().getIdentifierMapping(); return dialect().getIdentityColumnSupport() .appendIdentitySelectToInsert( identifierMapping.getSelectionExpression(), insertSQL ); } @Override public PreparedStatement prepareStatement(String sql, SharedSessionContractImplementor session) { - return session.getJdbcCoordinator().getMutationStatementPreparer().prepareStatement( sql, NO_GENERATED_KEYS ); + return session.getJdbcCoordinator().getMutationStatementPreparer() + .prepareStatement( sql, NO_GENERATED_KEYS ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/insert/SybaseJConnGetGeneratedKeysDelegate.java b/hibernate-core/src/main/java/org/hibernate/id/insert/SybaseJConnGetGeneratedKeysDelegate.java index 3035a4304fa8..f1988411468d 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/insert/SybaseJConnGetGeneratedKeysDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/id/insert/SybaseJConnGetGeneratedKeysDelegate.java @@ -8,8 +8,6 @@ import java.sql.ResultSet; import java.sql.SQLException; -import org.hibernate.engine.jdbc.spi.JdbcCoordinator; -import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.generator.EventType; import org.hibernate.generator.values.GeneratedValues; @@ -33,8 +31,9 @@ public SybaseJConnGetGeneratedKeysDelegate(EntityPersister persister) { @Override public String prepareIdentifierGeneratingInsert(String insertSQL) { - final BasicEntityIdentifierMapping identifierMapping = - (BasicEntityIdentifierMapping) persister.getRootEntityDescriptor().getIdentifierMapping(); + final var identifierMapping = + (BasicEntityIdentifierMapping) + persister.getRootEntityDescriptor().getIdentifierMapping(); return dialect().getIdentityColumnSupport() .appendIdentitySelectToInsert( identifierMapping.getSelectionExpression(), insertSQL ); } @@ -44,10 +43,10 @@ public GeneratedValues executeAndExtractReturning( String sql, PreparedStatement preparedStatement, SharedSessionContractImplementor session) { - JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator(); - final JdbcServices jdbcServices = session.getJdbcServices(); + final var jdbcCoordinator = session.getJdbcCoordinator(); + final var jdbcServices = session.getJdbcServices(); - ResultSet resultSet = jdbcCoordinator.getResultSetReturn().execute( preparedStatement, sql ); + final ResultSet resultSet = jdbcCoordinator.getResultSetReturn().execute( preparedStatement, sql ); try { return getGeneratedValues( resultSet, preparedStatement, persister, getTiming(), session ); } diff --git a/hibernate-core/src/main/java/org/hibernate/id/insert/UniqueKeySelectingDelegate.java b/hibernate-core/src/main/java/org/hibernate/id/insert/UniqueKeySelectingDelegate.java index c20deaa2be91..0739702c0394 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/insert/UniqueKeySelectingDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/id/insert/UniqueKeySelectingDelegate.java @@ -12,7 +12,6 @@ import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.generator.EventType; -import org.hibernate.generator.values.GeneratedValueBasicResultBuilder; import org.hibernate.jdbc.Expectation; import org.hibernate.metamodel.mapping.EntityRowIdMapping; import org.hibernate.persister.entity.EntityPersister; @@ -21,6 +20,7 @@ import org.hibernate.type.Type; import static org.hibernate.generator.values.internal.GeneratedValuesHelper.getActualGeneratedModelPart; +import static org.hibernate.internal.util.StringHelper.EMPTY_STRINGS; /** * Uses a unique key of the inserted entity to locate the newly inserted row. @@ -50,14 +50,14 @@ public UniqueKeySelectingDelegate( if ( !persister.isIdentifierAssignedByInsert() || persister.getInsertGeneratedProperties().size() > 1 || rowIdMapping != null ) { - final List resultBuilders = jdbcValuesMappingProducer.getResultBuilders(); + final var resultBuilders = jdbcValuesMappingProducer.getResultBuilders(); final List columnNames = new ArrayList<>( resultBuilders.size() ); - for ( GeneratedValueBasicResultBuilder resultBuilder : resultBuilders ) { + for ( var resultBuilder : resultBuilders ) { columnNames.add( getActualGeneratedModelPart( resultBuilder.getModelPart() ).getSelectionExpression() ); } selectString = persister.getSelectByUniqueKeyString( uniqueKeyPropertyNames, - columnNames.toArray( new String[0] ) + columnNames.toArray( EMPTY_STRINGS ) ); } else { diff --git a/hibernate-core/src/main/java/org/hibernate/internal/OptimisticLockHelper.java b/hibernate-core/src/main/java/org/hibernate/internal/OptimisticLockHelper.java index 2c1105959bbc..0f978e279b08 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/OptimisticLockHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/OptimisticLockHelper.java @@ -10,14 +10,12 @@ import org.hibernate.cache.spi.access.SoftLock; import org.hibernate.cache.spi.entry.CacheEntry; import org.hibernate.engine.spi.EntityEntry; -import org.hibernate.engine.spi.SessionEventListenerManager; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.engine.spi.Status; import org.hibernate.event.monitor.spi.DiagnosticEvent; import org.hibernate.event.monitor.spi.EventMonitor; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.stat.internal.StatsHelper; -import org.hibernate.stat.spi.StatisticsImplementor; public final class OptimisticLockHelper { @@ -76,7 +74,7 @@ else if ( session.getCacheMode().isPutEnabled() ) { final Object cacheEntry = persister.getCacheEntryStructure().structure( ce ); final boolean put = updateCache( persister, cacheEntry, previousVersion, nextVersion, ck, session ); - final StatisticsImplementor statistics = session.getFactory().getStatistics(); + final var statistics = session.getFactory().getStatistics(); if ( put && statistics.isStatisticsEnabled() ) { statistics.entityCachePut( StatsHelper.getRootEntityRole( persister ), @@ -92,9 +90,10 @@ private static boolean updateCache(EntityPersister persister, Object cacheEntry, final EventMonitor eventMonitor = session.getEventMonitor(); final DiagnosticEvent cachePutEvent = eventMonitor.beginCachePutEvent(); final EntityDataAccess cacheAccessStrategy = persister.getCacheAccessStrategy(); + final var eventListenerManager = session.getEventListenerManager(); boolean update = false; try { - session.getEventListenerManager().cachePutStart(); + eventListenerManager.cachePutStart(); update = cacheAccessStrategy.update( session, ck, cacheEntry, nextVersion, previousVersion ); return update; } @@ -107,7 +106,7 @@ private static boolean updateCache(EntityPersister persister, Object cacheEntry, update, EventMonitor.CacheActionDescription.ENTITY_UPDATE ); - session.getEventListenerManager().cachePutEnd(); + eventListenerManager.cachePutEnd(); } } @@ -155,7 +154,7 @@ private static boolean cacheUpdateRequired(boolean success, EntityPersister pers } protected void cacheAfterUpdate(EntityDataAccess cache, Object ck, SharedSessionContractImplementor session) { - final SessionEventListenerManager eventListenerManager = session.getEventListenerManager(); + final var eventListenerManager = session.getEventListenerManager(); final EventMonitor eventMonitor = session.getEventMonitor(); final DiagnosticEvent cachePutEvent = eventMonitor.beginCachePutEvent(); boolean put = false; @@ -172,7 +171,7 @@ protected void cacheAfterUpdate(EntityDataAccess cache, Object ck, SharedSession put, EventMonitor.CacheActionDescription.ENTITY_AFTER_UPDATE ); - final StatisticsImplementor statistics = session.getFactory().getStatistics(); + final var statistics = session.getFactory().getStatistics(); if ( put && statistics.isStatisticsEnabled() ) { statistics.entityCachePut( StatsHelper.getRootEntityRole( persister ), diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/ExecuteWithTemporaryTableHelper.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/ExecuteWithTemporaryTableHelper.java index d6badb79a170..8459f100879d 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/ExecuteWithTemporaryTableHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/ExecuteWithTemporaryTableHelper.java @@ -4,31 +4,26 @@ */ package org.hibernate.query.sqm.mutation.internal.temptable; -import java.util.UUID; -import java.util.function.Function; - import org.hibernate.LockMode; import org.hibernate.LockOptions; -import org.hibernate.boot.TempTableDdlTransactionHandling; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.temptable.TemporaryTable; import org.hibernate.dialect.temptable.TemporaryTableColumn; import org.hibernate.dialect.temptable.TemporaryTableHelper; +import org.hibernate.dialect.temptable.TemporaryTableHelper.TemporaryTableCreationWork; +import org.hibernate.dialect.temptable.TemporaryTableHelper.TemporaryTableDropWork; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.spi.JdbcServices; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.query.sqm.mutation.spi.AfterUseAction; -import org.hibernate.query.sqm.mutation.spi.BeforeUseAction; -import org.hibernate.resource.transaction.spi.IsolationDelegate; import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.ModelPart; import org.hibernate.query.sqm.ComparisonOperator; import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter; +import org.hibernate.query.sqm.mutation.spi.AfterUseAction; +import org.hibernate.query.sqm.mutation.spi.BeforeUseAction; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.SqlAstJoinType; -import org.hibernate.sql.ast.SqlAstTranslatorFactory; import org.hibernate.sql.ast.tree.expression.ColumnReference; import org.hibernate.sql.ast.tree.expression.QueryLiteral; import org.hibernate.sql.ast.tree.from.NamedTableReference; @@ -38,12 +33,18 @@ import org.hibernate.sql.ast.tree.insert.InsertSelectStatement; import org.hibernate.sql.ast.tree.predicate.ComparisonPredicate; import org.hibernate.sql.ast.tree.predicate.Predicate; +import org.hibernate.sql.ast.tree.select.QueryPart; import org.hibernate.sql.ast.tree.select.QuerySpec; import org.hibernate.sql.exec.spi.ExecutionContext; -import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.results.internal.SqlSelectionImpl; +import java.util.UUID; +import java.util.function.Function; + +import static org.hibernate.boot.TempTableDdlTransactionHandling.ISOLATE_AND_TRANSACT; +import static org.hibernate.boot.TempTableDdlTransactionHandling.NONE; + /** * @author Steve Ebersole */ @@ -58,12 +59,8 @@ public static int saveMatchingIdsIntoIdTable( Function sessionUidAccess, JdbcParameterBindings jdbcParameterBindings, ExecutionContext executionContext) { - final SessionFactoryImplementor factory = executionContext.getSession().getFactory(); - final TableGroup mutatingTableGroup = sqmConverter.getMutatingTableGroup(); - - assert mutatingTableGroup.getModelPart() instanceof EntityMappingType; - final EntityMappingType mutatingEntityDescriptor = (EntityMappingType) mutatingTableGroup.getModelPart(); + final var mutatingEntityDescriptor = (EntityMappingType) mutatingTableGroup.getModelPart(); final NamedTableReference idTableReference = new NamedTableReference( idTable.getTableExpression(), @@ -92,15 +89,14 @@ public static int saveMatchingIdsIntoIdTable( mutatingEntityDescriptor.getIdentifierMapping().forEachSelectable( (selectionIndex, selection) -> { - final TableReference tableReference = mutatingTableGroup.resolveTableReference( - mutatingTableGroup.getNavigablePath(), - selection.getContainingTableExpression() - ); matchingIdSelection.getSelectClause().addSqlSelection( new SqlSelectionImpl( selectionIndex, sqmConverter.getSqlExpressionResolver().resolveSqlExpression( - tableReference, + mutatingTableGroup.resolveTableReference( + mutatingTableGroup.getNavigablePath(), + selection.getContainingTableExpression() + ), selection ) ) @@ -129,22 +125,23 @@ public static int saveIntoTemporaryTable( InsertSelectStatement temporaryTableInsert, JdbcParameterBindings jdbcParameterBindings, ExecutionContext executionContext) { - final SessionFactoryImplementor factory = executionContext.getSession().getFactory(); + final var factory = executionContext.getSession().getFactory(); final JdbcServices jdbcServices = factory.getJdbcServices(); final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment(); - final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcEnvironment.getSqlAstTranslatorFactory(); final LockOptions lockOptions = executionContext.getQueryOptions().getLockOptions(); final LockMode lockMode = lockOptions.getLockMode(); // Acquire a WRITE lock for the rows that are about to be modified lockOptions.setLockMode( LockMode.WRITE ); // Visit the table joins and reset the lock mode if we encounter OUTER joins that are not supported - if ( temporaryTableInsert.getSourceSelectStatement() != null + final QueryPart sourceSelectStatement = temporaryTableInsert.getSourceSelectStatement(); + if ( sourceSelectStatement != null && !jdbcEnvironment.getDialect().supportsOuterJoinForUpdate() ) { - temporaryTableInsert.getSourceSelectStatement().visitQuerySpecs( + sourceSelectStatement.visitQuerySpecs( querySpec -> { querySpec.getFromClause().visitTableJoins( tableJoin -> { - if ( tableJoin.isInitialized() && tableJoin.getJoinType() != SqlAstJoinType.INNER ) { + if ( tableJoin.isInitialized() + && tableJoin.getJoinType() != SqlAstJoinType.INNER ) { lockOptions.setLockMode( lockMode ); } } @@ -152,17 +149,17 @@ public static int saveIntoTemporaryTable( } ); } - final JdbcOperationQueryMutation jdbcInsert = sqlAstTranslatorFactory.buildMutationTranslator( factory, temporaryTableInsert ) - .translate( jdbcParameterBindings, executionContext.getQueryOptions() ); + final var jdbcInsert = + jdbcEnvironment.getSqlAstTranslatorFactory() + .buildMutationTranslator( factory, temporaryTableInsert ) + .translate( jdbcParameterBindings, executionContext.getQueryOptions() ); lockOptions.setLockMode( lockMode ); return jdbcServices.getJdbcMutationExecutor().execute( jdbcInsert, jdbcParameterBindings, - sql -> executionContext.getSession() - .getJdbcCoordinator() - .getStatementPreparer() - .prepareStatement( sql ), + sql -> executionContext.getSession().getJdbcCoordinator() + .getStatementPreparer().prepareStatement( sql ), (integer, preparedStatement) -> {}, executionContext ); @@ -201,7 +198,7 @@ public static QuerySpec createIdTableSelectQuerySpec( querySpec.getFromClause().addRoot( idTableGroup ); - applyIdTableSelections( querySpec, idTableReference, idTable, fkModelPart, executionContext ); + applyIdTableSelections( querySpec, idTableReference, idTable, fkModelPart ); applyIdTableRestrictions( querySpec, idTableReference, idTable, sessionUidAccess, executionContext ); return querySpec; @@ -211,12 +208,11 @@ private static void applyIdTableSelections( QuerySpec querySpec, TableReference tableReference, TemporaryTable idTable, - ModelPart fkModelPart, - ExecutionContext executionContext) { + ModelPart fkModelPart) { if ( fkModelPart == null ) { final int size = idTable.getEntityDescriptor().getIdentifierMapping().getJdbcTypeCount(); for ( int i = 0; i < size; i++ ) { - final TemporaryTableColumn temporaryTableColumn = idTable.getColumns().get( i ); + final var temporaryTableColumn = idTable.getColumns().get( i ); if ( temporaryTableColumn != idTable.getSessionUidColumn() ) { querySpec.getSelectClause().addSqlSelection( new SqlSelectionImpl( @@ -282,25 +278,21 @@ private static void applyIdTableRestrictions( public static void performBeforeTemporaryTableUseActions( TemporaryTable temporaryTable, ExecutionContext executionContext) { - final SessionFactoryImplementor factory = executionContext.getSession().getFactory(); + final var factory = executionContext.getSession().getFactory(); final Dialect dialect = factory.getJdbcServices().getDialect(); if ( dialect.getTemporaryTableBeforeUseAction() == BeforeUseAction.CREATE ) { - final TemporaryTableHelper.TemporaryTableCreationWork temporaryTableCreationWork = new TemporaryTableHelper.TemporaryTableCreationWork( - temporaryTable, - factory - ); - - final TempTableDdlTransactionHandling ddlTransactionHandling = dialect.getTemporaryTableDdlTransactionHandling(); - if ( ddlTransactionHandling == TempTableDdlTransactionHandling.NONE ) { + final var temporaryTableCreationWork = + new TemporaryTableCreationWork( temporaryTable, factory ); + final var ddlTransactionHandling = dialect.getTemporaryTableDdlTransactionHandling(); + if ( ddlTransactionHandling == NONE ) { executionContext.getSession().doWork( temporaryTableCreationWork ); } else { - final IsolationDelegate isolationDelegate = executionContext.getSession() - .getJdbcCoordinator() - .getJdbcSessionOwner() - .getTransactionCoordinator() - .createIsolationDelegate(); - isolationDelegate.delegateWork( temporaryTableCreationWork, ddlTransactionHandling == TempTableDdlTransactionHandling.ISOLATE_AND_TRANSACT ); + final var isolationDelegate = + executionContext.getSession().getJdbcCoordinator().getJdbcSessionOwner() + .getTransactionCoordinator().createIsolationDelegate(); + isolationDelegate.delegateWork( temporaryTableCreationWork, + ddlTransactionHandling == ISOLATE_AND_TRANSACT ); } } } @@ -310,7 +302,7 @@ public static void performAfterTemporaryTableUseActions( Function sessionUidAccess, AfterUseAction afterUseAction, ExecutionContext executionContext) { - final SessionFactoryImplementor factory = executionContext.getSession().getFactory(); + final var factory = executionContext.getSession().getFactory(); final Dialect dialect = factory.getJdbcServices().getDialect(); switch ( afterUseAction ) { case CLEAN: @@ -322,25 +314,17 @@ public static void performAfterTemporaryTableUseActions( ); break; case DROP: - final TemporaryTableHelper.TemporaryTableDropWork temporaryTableDropWork = new TemporaryTableHelper.TemporaryTableDropWork( - temporaryTable, - factory - ); - - final TempTableDdlTransactionHandling ddlTransactionHandling = dialect.getTemporaryTableDdlTransactionHandling(); - if ( ddlTransactionHandling == TempTableDdlTransactionHandling.NONE ) { + final var temporaryTableDropWork = new TemporaryTableDropWork( temporaryTable, factory ); + final var ddlTransactionHandling = dialect.getTemporaryTableDdlTransactionHandling(); + if ( ddlTransactionHandling == NONE ) { executionContext.getSession().doWork( temporaryTableDropWork ); } else { - final IsolationDelegate isolationDelegate = executionContext.getSession() - .getJdbcCoordinator() - .getJdbcSessionOwner() - .getTransactionCoordinator() - .createIsolationDelegate(); - isolationDelegate.delegateWork( - temporaryTableDropWork, - ddlTransactionHandling == TempTableDdlTransactionHandling.ISOLATE_AND_TRANSACT - ); + final var isolationDelegate = + executionContext.getSession().getJdbcCoordinator().getJdbcSessionOwner() + .getTransactionCoordinator().createIsolationDelegate(); + isolationDelegate.delegateWork( temporaryTableDropWork, + ddlTransactionHandling == ISOLATE_AND_TRANSACT ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsImpl.java b/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsImpl.java index 702fc81494fe..62812199e290 100644 --- a/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsImpl.java @@ -4,7 +4,6 @@ */ package org.hibernate.result.internal; -import java.io.Serializable; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -14,14 +13,11 @@ import java.util.function.Supplier; import org.hibernate.JDBCException; -import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.jdbc.spi.SqlStatementLogger; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.event.monitor.spi.EventMonitor; import org.hibernate.event.monitor.spi.DiagnosticEvent; import org.hibernate.internal.CoreLogging; import org.hibernate.procedure.internal.ProcedureCallImpl; -import org.hibernate.query.results.ResultSetMapping; import org.hibernate.result.Output; import org.hibernate.result.Outputs; import org.hibernate.result.spi.ResultContext; @@ -34,11 +30,12 @@ import org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl; import org.hibernate.sql.results.jdbc.internal.JdbcValuesSourceProcessingStateStandardImpl; import org.hibernate.sql.results.jdbc.spi.JdbcValues; -import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingOptions; import org.hibernate.sql.results.spi.RowReader; import org.jboss.logging.Logger; +import static org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingOptions.NO_OPTIONS; + /** * @author Steve Ebersole @@ -69,7 +66,8 @@ protected void executeStatement() { if ( sqlStatementLogger.getLogSlowQuery() > 0 ) { executeStartNanos = System.nanoTime(); } - final EventMonitor eventMonitor = context.getSession().getEventMonitor(); + final var session = context.getSession(); + final EventMonitor eventMonitor = session.getEventMonitor(); final DiagnosticEvent jdbcPreparedStatementExecutionEvent = eventMonitor.beginJdbcPreparedStatementExecutionEvent(); try { @@ -81,7 +79,7 @@ protected void executeStatement() { } finally { eventMonitor.completeJdbcPreparedStatementExecutionEvent( jdbcPreparedStatementExecutionEvent, sql ); - sqlStatementLogger.logSlowQuery( sql, executeStartNanos, this.context.getSession().getJdbcSessionContext() ); + sqlStatementLogger.logSlowQuery( sql, executeStartNanos, session.getJdbcSessionContext() ); } } @@ -136,7 +134,7 @@ public boolean goToNext() { @Override public void release() { - final JdbcCoordinator jdbcCoordinator = context.getSession().getJdbcCoordinator(); + final var jdbcCoordinator = context.getSession().getJdbcCoordinator(); jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( jdbcStatement ); jdbcCoordinator.afterStatementExecution(); } @@ -151,22 +149,24 @@ private List extractCurrentResults() { } protected List extractResults(ResultSet resultSet) { + final var session = context.getSession(); + final var factory = session.getFactory(); + final var influencers = session.getLoadQueryInfluencers(); - final DirectResultSetAccess resultSetAccess = - new DirectResultSetAccess( context.getSession(), jdbcStatement, resultSet ); + final var resultSetAccess = new DirectResultSetAccess( session, jdbcStatement, resultSet ); - final ProcedureCallImpl procedureCall = (ProcedureCallImpl) context; - final ResultSetMapping resultSetMapping = procedureCall.getResultSetMapping(); + final var procedureCall = (ProcedureCallImpl) context; + final var resultSetMapping = procedureCall.getResultSetMapping(); - final ExecutionContext executionContext = new OutputsExecutionContext( context.getSession() ); + final ExecutionContext executionContext = new OutputsExecutionContext( session ); final JdbcValues jdbcValues = new JdbcValuesResultSetImpl( resultSetAccess, null, null, - this.context.getQueryOptions(), + context.getQueryOptions(), true, - resultSetMapping.resolve( resultSetAccess, context.getSession().getLoadQueryInfluencers(), getSessionFactory() ), + resultSetMapping.resolve( resultSetAccess, influencers, factory ), null, executionContext ); @@ -174,44 +174,17 @@ protected List extractResults(ResultSet resultSet) { try { final RowReader rowReader = ResultsHelper.createRowReader( - getSessionFactory(), + factory, RowTransformerStandardImpl.instance(), null, jdbcValues ); - /* - * Processing options effectively are only used for entity loading. Here we don't need these values. - */ - final JdbcValuesSourceProcessingOptions processingOptions = new JdbcValuesSourceProcessingOptions() { - @Override - public Object getEffectiveOptionalObject() { - return null; - } - - @Override - public String getEffectiveOptionalEntityName() { - return null; - } - - @Override - public Serializable getEffectiveOptionalId() { - return null; - } - - @Override - public boolean shouldReturnProxies() { - return true; - } - }; - final JdbcValuesSourceProcessingStateStandardImpl jdbcValuesSourceProcessingState = - new JdbcValuesSourceProcessingStateStandardImpl( - executionContext, - processingOptions - ); + final var jdbcValuesSourceProcessingState = + new JdbcValuesSourceProcessingStateStandardImpl( executionContext, NO_OPTIONS ); final ArrayList results = new ArrayList<>(); - final RowProcessingStateStandardImpl rowProcessingState = new RowProcessingStateStandardImpl( + final var rowProcessingState = new RowProcessingStateStandardImpl( jdbcValuesSourceProcessingState, executionContext, rowReader, @@ -229,10 +202,10 @@ public boolean shouldReturnProxies() { && procedureCall.isFunctionCall() && procedureCall.getFunctionReturn().getJdbcTypeCode() == Types.REF_CURSOR && results.size() == 1 - && results.get( 0 ) instanceof ResultSet ) { + && results.get( 0 ) instanceof ResultSet onlyResult ) { // When calling a function that returns a ref_cursor with as table function, // we have to unnest the ResultSet manually here - return extractResults( (ResultSet) results.get( 0 ) ); + return extractResults( onlyResult ); } return results; } @@ -242,14 +215,10 @@ public boolean shouldReturnProxies() { } } finally { - jdbcValues.finishUp( this.context.getSession() ); + jdbcValues.finishUp( session ); } } - private SessionFactoryImplementor getSessionFactory() { - return context.getSession().getFactory(); - } - /** * Encapsulates the information needed to interpret the current return within a result */ @@ -285,12 +254,8 @@ public Output getOutput() { protected Output buildOutput() { if ( log.isTraceEnabled() ) { - log.tracef( - "Building Return [isResultSet=%s, updateCount=%s, extendedReturn=%s]", - isResultSet(), - getUpdateCount(), - hasExtendedReturns() - ); + log.tracef( "Building Return [isResultSet=%s, updateCount=%s, extendedReturn=%s]", + isResultSet(), getUpdateCount(), hasExtendedReturns() ); } if ( isResultSet() ) { @@ -312,11 +277,11 @@ else if ( hasFunctionReturns() ) { // hooks for stored procedure (out param) processing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ protected Output buildResultSetOutput(List list) { - return new ResultSetOutputImpl( list ); + return new ResultSetOutputImpl<>( list ); } - protected Output buildResultSetOutput(Supplier> listSupplier) { - return new ResultSetOutputImpl( listSupplier ); + protected Output buildResultSetOutput(Supplier> listSupplier) { + return new ResultSetOutputImpl<>( listSupplier ); } protected Output buildUpdateCountOutput(int updateCount) { diff --git a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java index 93def9713749..1018af682883 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java @@ -9,11 +9,7 @@ import java.util.concurrent.TimeUnit; import org.hibernate.CacheMode; -import org.hibernate.SharedSessionContract; import org.hibernate.cache.spi.QueryKey; -import org.hibernate.cache.spi.QueryResultsCache; -import org.hibernate.engine.spi.LoadQueryInfluencers; -import org.hibernate.engine.spi.PersistenceContext; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.query.TupleTransformer; @@ -22,7 +18,6 @@ import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcSelectExecutor; -import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.internal.ResultsHelper; import org.hibernate.sql.results.internal.RowProcessingStateStandardImpl; import org.hibernate.sql.results.internal.RowTransformerStandardImpl; @@ -42,7 +37,6 @@ import org.hibernate.sql.results.spi.ResultsConsumer; import org.hibernate.sql.results.spi.RowReader; import org.hibernate.sql.results.spi.RowTransformer; -import org.hibernate.stat.spi.StatisticsImplementor; import org.hibernate.type.BasicType; import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.spi.TypeConfiguration; @@ -94,7 +88,7 @@ public T executeQuery( int resultCountEstimate, StatementCreator statementCreator, ResultsConsumer resultsConsumer) { - final PersistenceContext persistenceContext = executionContext.getSession().getPersistenceContext(); + final var persistenceContext = executionContext.getSession().getPersistenceContext(); final boolean defaultReadOnlyOrig = persistenceContext.isDefaultReadOnly(); final Boolean readOnly = executionContext.getQueryOptions().isReadOnly(); if ( readOnly != null ) { @@ -131,7 +125,7 @@ private T doExecuteQuery( StatementCreator statementCreator, ResultsConsumer resultsConsumer) { - final DeferredResultSetAccess deferredResultSetAccess = new DeferredResultSetAccess( + final var deferredResultSetAccess = new DeferredResultSetAccess( jdbcSelect, jdbcParameterBindings, executionContext, @@ -150,11 +144,11 @@ private T doExecuteQuery( rowTransformer = getRowTransformer( executionContext, jdbcValues ); } - final SharedSessionContractImplementor session = executionContext.getSession(); + final var session = executionContext.getSession(); final boolean stats; long startTime = 0; - final StatisticsImplementor statistics = session.getFactory().getStatistics(); + final var statistics = session.getFactory().getStatistics(); if ( executionContext.hasQueryExecutionToBeAddedToStatistics() && jdbcValues instanceof JdbcValuesResultSetImpl ) { stats = statistics.isStatisticsEnabled(); @@ -191,7 +185,7 @@ public boolean shouldReturnProxies() { } }; - final JdbcValuesSourceProcessingStateStandardImpl valuesProcessingState = + final var valuesProcessingState = new JdbcValuesSourceProcessingStateStandardImpl( executionContext, processingOptions ); final RowReader rowReader = ResultsHelper.createRowReader( @@ -201,12 +195,8 @@ public boolean shouldReturnProxies() { jdbcValues ); - final RowProcessingStateStandardImpl rowProcessingState = new RowProcessingStateStandardImpl( - valuesProcessingState, - executionContext, - rowReader, - jdbcValues - ); + final var rowProcessingState = + new RowProcessingStateStandardImpl( valuesProcessingState, executionContext, rowReader, jdbcValues ); final T result = resultsConsumer.consume( jdbcValues, @@ -233,13 +223,14 @@ public boolean shouldReturnProxies() { private static RowTransformer getRowTransformer(ExecutionContext executionContext, JdbcValues jdbcValues) { @SuppressWarnings("unchecked") - final TupleTransformer tupleTransformer = - (TupleTransformer) executionContext.getQueryOptions().getTupleTransformer(); + final var tupleTransformer = + (TupleTransformer) + executionContext.getQueryOptions().getTupleTransformer(); if ( tupleTransformer == null ) { return RowTransformerStandardImpl.instance(); } else { - final List> domainResults = jdbcValues.getValuesMapping().getDomainResults(); + final var domainResults = jdbcValues.getValuesMapping().getDomainResults(); final String[] aliases = new String[domainResults.size()]; for ( int i = 0; i < domainResults.size(); i++ ) { aliases[i] = domainResults.get( i ).getResultVariable(); @@ -258,12 +249,12 @@ private JdbcValues resolveJdbcValuesSource( boolean canBeCached, ExecutionContext executionContext, DeferredResultSetAccess resultSetAccess) { - final SharedSessionContractImplementor session = executionContext.getSession(); - final SessionFactoryImplementor factory = session.getFactory(); + final var session = executionContext.getSession(); + final var factory = session.getFactory(); final boolean queryCacheEnabled = factory.getSessionFactoryOptions().isQueryCacheEnabled(); final CacheMode cacheMode = resolveCacheMode( executionContext ); - final JdbcValuesMappingProducer mappingProducer = jdbcSelect.getJdbcValuesMappingProducer(); + final var mappingProducer = jdbcSelect.getJdbcValuesMappingProducer(); final QueryOptions queryOptions = executionContext.getQueryOptions(); final boolean cacheable = queryCacheEnabled @@ -282,8 +273,9 @@ private JdbcValues resolveJdbcValuesSource( SQL_EXEC_LOGGER.tracef( "Affected query spaces %s", querySpaces ); } - final QueryResultsCache queryCache = factory.getCache() - .getQueryResultsCache( queryOptions.getResultCacheRegionName() ); + final var queryCache = + factory.getCache() + .getQueryResultsCache( queryOptions.getResultCacheRegionName() ); queryResultsCacheKey = QueryKey.from( jdbcSelect.getSqlString(), @@ -308,7 +300,7 @@ private JdbcValues resolveJdbcValuesSource( // todo (6.0) : if we go this route (^^), still beneficial to have an abstraction over different UpdateTimestampsCache-based // invalidation strategies - QueryCacheInvalidationStrategy - final StatisticsImplementor statistics = factory.getStatistics(); + final var statistics = factory.getStatistics(); if ( statistics.isStatisticsEnabled() ) { if ( cachedResults == null ) { statistics.queryCacheMiss( queryIdentifier, queryCache.getRegion().getName() ); @@ -358,7 +350,7 @@ private static AbstractJdbcValues resolveJdbcValues( JdbcValuesMappingProducer mappingProducer, SharedSessionContractImplementor session, SessionFactoryImplementor factory) { - final LoadQueryInfluencers loadQueryInfluencers = session.getLoadQueryInfluencers(); + final var loadQueryInfluencers = session.getLoadQueryInfluencers(); if ( cachedResults == null ) { final CachedJdbcValuesMetadata metadataForCache; final JdbcValuesMapping jdbcValuesMapping; @@ -368,7 +360,7 @@ private static AbstractJdbcValues resolveJdbcValues( } else { // If we need to put the values into the cache, we need to be able to capture the JdbcValuesMetadata - final CapturingJdbcValuesMetadata capturingMetadata = new CapturingJdbcValuesMetadata( resultSetAccess ); + final var capturingMetadata = new CapturingJdbcValuesMetadata( resultSetAccess ); jdbcValuesMapping = mappingProducer.resolve( capturingMetadata, loadQueryInfluencers, factory ); metadataForCache = capturingMetadata.resolveMetadataForCache(); } @@ -384,7 +376,7 @@ private static AbstractJdbcValues resolveJdbcValues( ); } else { - final JdbcValuesMetadata valuesMetadata = + final var valuesMetadata = !cachedResults.isEmpty() && cachedResults.get( 0 ) instanceof JdbcValuesMetadata jdbcValuesMetadata ? jdbcValuesMetadata @@ -395,8 +387,8 @@ private static AbstractJdbcValues resolveJdbcValues( } private static CacheMode resolveCacheMode(ExecutionContext executionContext) { - final QueryOptions queryOptions = executionContext.getQueryOptions(); - final SharedSessionContract session = executionContext.getSession(); + final var queryOptions = executionContext.getQueryOptions(); + final var session = executionContext.getSession(); return coalesceSuppliedValues( () -> queryOptions == null ? null : queryOptions.getCacheMode(), session::getCacheMode, diff --git a/hibernate-core/src/main/java/org/hibernate/sql/model/ast/builder/TableUpdateBuilderStandard.java b/hibernate-core/src/main/java/org/hibernate/sql/model/ast/builder/TableUpdateBuilderStandard.java index 184679a8161d..60550a8ce2e3 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/model/ast/builder/TableUpdateBuilderStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/model/ast/builder/TableUpdateBuilderStandard.java @@ -4,14 +4,11 @@ */ package org.hibernate.sql.model.ast.builder; -import java.util.Collections; -import java.util.List; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.sql.model.MutationOperation; import org.hibernate.sql.model.MutationTarget; import org.hibernate.sql.model.TableMapping; -import org.hibernate.sql.model.ast.ColumnValueBinding; import org.hibernate.sql.model.ast.MutatingTableReference; import org.hibernate.sql.model.ast.RestrictedTableMutation; import org.hibernate.sql.model.internal.OptionalTableUpdate; @@ -19,12 +16,15 @@ import org.hibernate.sql.model.internal.TableUpdateNoSet; import org.hibernate.sql.model.internal.TableUpdateStandard; +import static java.util.Collections.emptyList; + /** * Standard TableUpdateBuilder implementation * * @author Steve Ebersole */ -public class TableUpdateBuilderStandard extends AbstractTableUpdateBuilder { +public class TableUpdateBuilderStandard + extends AbstractTableUpdateBuilder { private final String whereFragment; public TableUpdateBuilderStandard( @@ -55,45 +55,50 @@ public String getWhereFragment() { return whereFragment; } + //TODO: The unchecked typecasts here are horrible @SuppressWarnings("unchecked") @Override public RestrictedTableMutation buildMutation() { - final List valueBindings = combine( getValueBindings(), getKeyBindings(), getLobValueBindings() ); + final var valueBindings = combine( getValueBindings(), getKeyBindings(), getLobValueBindings() ); if ( valueBindings.isEmpty() ) { - return (RestrictedTableMutation) new TableUpdateNoSet( getMutatingTable(), getMutationTarget() ); + return (RestrictedTableMutation) + new TableUpdateNoSet( getMutatingTable(), getMutationTarget() ); } if ( getMutatingTable().getTableMapping().getUpdateDetails().getCustomSql() != null ) { - return (RestrictedTableMutation) new TableUpdateCustomSql( - getMutatingTable(), - getMutationTarget(), - getSqlComment(), - valueBindings, - getKeyRestrictionBindings(), - getOptimisticLockBindings() - ); + return (RestrictedTableMutation) + new TableUpdateCustomSql( + getMutatingTable(), + getMutationTarget(), + getSqlComment(), + valueBindings, + getKeyRestrictionBindings(), + getOptimisticLockBindings() + ); } if ( getMutatingTable().getTableMapping().isOptional() ) { - return (RestrictedTableMutation) new OptionalTableUpdate( - getMutatingTable(), - getMutationTarget(), - valueBindings, - getKeyRestrictionBindings(), - getOptimisticLockBindings() - ); + return (RestrictedTableMutation) + new OptionalTableUpdate( + getMutatingTable(), + getMutationTarget(), + valueBindings, + getKeyRestrictionBindings(), + getOptimisticLockBindings() + ); } - return (RestrictedTableMutation) new TableUpdateStandard( - getMutatingTable(), - getMutationTarget(), - getSqlComment(), - valueBindings, - getKeyRestrictionBindings(), - getOptimisticLockBindings(), - whereFragment, - null, - Collections.emptyList() - ); + return (RestrictedTableMutation) + new TableUpdateStandard( + getMutatingTable(), + getMutationTarget(), + getSqlComment(), + valueBindings, + getKeyRestrictionBindings(), + getOptimisticLockBindings(), + whereFragment, + null, + emptyList() + ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/spi/JdbcValuesSourceProcessingOptions.java b/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/spi/JdbcValuesSourceProcessingOptions.java index 4d5e777c3d6a..74614473477b 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/spi/JdbcValuesSourceProcessingOptions.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/spi/JdbcValuesSourceProcessingOptions.java @@ -15,4 +15,27 @@ public interface JdbcValuesSourceProcessingOptions { Object getEffectiveOptionalId(); boolean shouldReturnProxies(); + + JdbcValuesSourceProcessingOptions NO_OPTIONS = + new JdbcValuesSourceProcessingOptions() { + @Override + public Object getEffectiveOptionalObject() { + return null; + } + + @Override + public String getEffectiveOptionalEntityName() { + return null; + } + + @Override + public Object getEffectiveOptionalId() { + return null; + } + + @Override + public boolean shouldReturnProxies() { + return true; + } + }; }