diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SingleStoreDialect.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SingleStoreDialect.java index 038b9540e58b..76d2f97ecce8 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SingleStoreDialect.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SingleStoreDialect.java @@ -235,8 +235,7 @@ private static SingleStoreTableType getTableType(DialectResolutionInfo info) { private static boolean getUpdateForEnabled(DialectResolutionInfo info) { return ConfigurationHelper.getBoolean( SINGLE_STORE_FOR_UPDATE_LOCK_ENABLED, - info.getConfigurationValues(), - false + info.getConfigurationValues() ); } 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 641d9607d157..3bb060a60bcd 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 @@ -52,7 +52,6 @@ import org.hibernate.engine.config.spi.ConfigurationService; import org.hibernate.engine.jdbc.env.spi.ExtractedDatabaseMetaData; import org.hibernate.engine.jdbc.spi.JdbcServices; -import org.hibernate.id.uuid.LocalObjectUuidHelper; import org.hibernate.internal.BaselineSessionEventsListenerBuilder; import org.hibernate.internal.EmptyInterceptor; import org.hibernate.internal.util.NullnessHelper; @@ -77,7 +76,6 @@ import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode; import org.hibernate.resource.jdbc.spi.StatementInspector; import org.hibernate.resource.transaction.spi.TransactionCoordinatorBuilder; -import org.hibernate.stat.Statistics; import org.hibernate.type.format.FormatMapper; import org.hibernate.type.format.jaxb.JaxbXmlFormatMapper; @@ -88,6 +86,7 @@ import static org.hibernate.cfg.AvailableSettings.*; import static org.hibernate.cfg.DialectSpecificSettings.ORACLE_OSON_DISABLED; import static org.hibernate.engine.config.spi.StandardConverters.BOOLEAN; +import static org.hibernate.id.uuid.LocalObjectUuidHelper.generateLocalObjectUuid; import static org.hibernate.internal.LockOptionsHelper.applyPropertiesToLockOptions; import static org.hibernate.internal.log.DeprecationLogger.DEPRECATION_LOGGER; import static org.hibernate.internal.util.PropertiesHelper.map; @@ -99,6 +98,7 @@ import static org.hibernate.internal.util.config.ConfigurationHelper.getString; import static org.hibernate.jpa.internal.util.CacheModeHelper.interpretCacheMode; import static org.hibernate.jpa.internal.util.ConfigurationHelper.getFlushMode; +import static org.hibernate.stat.Statistics.DEFAULT_QUERY_STATISTICS_MAX_SIZE; import static org.hibernate.type.format.jackson.JacksonIntegration.getJsonJacksonFormatMapperOrNull; import static org.hibernate.type.format.jackson.JacksonIntegration.getOsonJacksonFormatMapperOrNull; import static org.hibernate.type.format.jackson.JacksonIntegration.getXMLJacksonFormatMapperOrNull; @@ -117,7 +117,7 @@ */ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { - private final String uuid = LocalObjectUuidHelper.generateLocalObjectUuid(); + private final String uuid = generateLocalObjectUuid(); private final StandardServiceRegistry serviceRegistry; // integration @@ -416,7 +416,8 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo strategySelector.resolveDefaultableStrategy( TimestampsCacheFactory.class, settings.get( QUERY_CACHE_FACTORY ), StandardTimestampsCacheFactory.INSTANCE ); minimalPutsEnabled = - configurationService.getSetting( USE_MINIMAL_PUTS, BOOLEAN, regionFactory.isMinimalPutsEnabledByDefault() ); + configurationService.getSetting( USE_MINIMAL_PUTS, BOOLEAN, + regionFactory.isMinimalPutsEnabledByDefault() ); structuredCacheEntriesEnabled = configurationService.getSetting( USE_STRUCTURED_CACHE, BOOLEAN, false ); directReferenceCacheEntriesEnabled = @@ -462,7 +463,7 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo connectionHandlingMode = interpretConnectionHandlingMode( settings, serviceRegistry ); connectionProviderDisablesAutoCommit = - getBoolean( CONNECTION_PROVIDER_DISABLES_AUTOCOMMIT, settings, false ); + getBoolean( CONNECTION_PROVIDER_DISABLES_AUTOCOMMIT, settings ); commentsEnabled = getBoolean( USE_SQL_COMMENTS, settings ); @@ -479,10 +480,9 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo criteriaValueHandlingMode = ValueHandlingMode.interpret( settings.get( CRITERIA_VALUE_HANDLING_MODE ) ); criteriaCopyTreeEnabled = getBoolean( CRITERIA_COPY_TREE, settings, jpaBootstrap ); - criteriaPlanCacheEnabled = getBoolean( CRITERIA_PLAN_CACHE_ENABLED, settings, false ); + criteriaPlanCacheEnabled = getBoolean( CRITERIA_PLAN_CACHE_ENABLED, settings ); - nativeJdbcParametersIgnored = - getBoolean( NATIVE_IGNORE_JDBC_PARAMETERS, settings, false ); + nativeJdbcParametersIgnored = getBoolean( NATIVE_IGNORE_JDBC_PARAMETERS, settings ); // added the boolean parameter in case we want to define some form of "all" as discussed jpaCompliance = context.getJpaCompliance(); @@ -504,16 +504,14 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo xmlFunctionsEnabled = getBoolean( XML_FUNCTIONS_ENABLED, settings ); queryStatisticsMaxSize = - getInt( QUERY_STATISTICS_MAX_SIZE, settings, Statistics.DEFAULT_QUERY_STATISTICS_MAX_SIZE ); + getInt( QUERY_STATISTICS_MAX_SIZE, settings, DEFAULT_QUERY_STATISTICS_MAX_SIZE ); unownedAssociationTransientCheck = getBoolean( UNOWNED_ASSOCIATION_TRANSIENT_CHECK, settings, isJpaBootstrap() ); - passProcedureParameterNames = - getBoolean( QUERY_PASS_PROCEDURE_PARAMETER_NAMES, settings, false ); + passProcedureParameterNames = getBoolean( QUERY_PASS_PROCEDURE_PARAMETER_NAMES, settings ); - preferJdbcDatetimeTypes = - getBoolean( NATIVE_PREFER_JDBC_DATETIME_TYPES, settings, false ); + preferJdbcDatetimeTypes = getBoolean( NATIVE_PREFER_JDBC_DATETIME_TYPES, settings ); defaultSessionProperties = initializeDefaultSessionProperties( configurationService ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/MySQLServerConfiguration.java b/hibernate-core/src/main/java/org/hibernate/dialect/MySQLServerConfiguration.java index 362f7af9c668..1c1cc77062ea 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/MySQLServerConfiguration.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/MySQLServerConfiguration.java @@ -76,7 +76,7 @@ public static MySQLServerConfiguration fromDialectResolutionInfo(DialectResoluti bytesPerCharacter = getInt( MYSQL_BYTES_PER_CHARACTER, info.getConfigurationValues(), 4 ); } if ( noBackslashEscapes == null ) { - noBackslashEscapes = getBoolean( MYSQL_NO_BACKSLASH_ESCAPES, info.getConfigurationValues(), false ); + noBackslashEscapes = getBoolean( MYSQL_NO_BACKSLASH_ESCAPES, info.getConfigurationValues() ); } return new MySQLServerConfiguration( bytesPerCharacter, noBackslashEscapes ); } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/OracleServerConfiguration.java b/hibernate-core/src/main/java/org/hibernate/dialect/OracleServerConfiguration.java index a9caf5c387b1..c378b732be12 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/OracleServerConfiguration.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/OracleServerConfiguration.java @@ -85,9 +85,9 @@ public static OracleServerConfiguration fromDialectResolutionInfo(DialectResolut // default to the dialect-specific configuration settings final Map configuration = info.getConfigurationValues(); - final boolean defaultExtended = getBoolean( ORACLE_EXTENDED_STRING_SIZE, configuration, false ); - final boolean defaultAutonomous = getBoolean( ORACLE_AUTONOMOUS_DATABASE, configuration, false ); - final boolean defaultContinuity = getBoolean( ORACLE_APPLICATION_CONTINUITY, configuration, false ); + final boolean defaultExtended = getBoolean( ORACLE_EXTENDED_STRING_SIZE, configuration ); + final boolean defaultAutonomous = getBoolean( ORACLE_AUTONOMOUS_DATABASE, configuration ); + final boolean defaultContinuity = getBoolean( ORACLE_APPLICATION_CONTINUITY, configuration ); boolean extended; boolean autonomous; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseASEDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseASEDialect.java index 4626104e2d03..fccfbd3fa031 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseASEDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseASEDialect.java @@ -41,12 +41,9 @@ import org.hibernate.type.descriptor.jdbc.JdbcType; import org.hibernate.type.descriptor.jdbc.TimestampJdbcType; import org.hibernate.type.descriptor.jdbc.TinyIntJdbcType; -import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry; import org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType; import org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry; -import java.sql.DatabaseMetaData; -import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; @@ -206,10 +203,10 @@ public long getDefaultLobLength() { } private static boolean isAnsiNull(DialectResolutionInfo info) { - final DatabaseMetaData databaseMetaData = info.getDatabaseMetadata(); + final var databaseMetaData = info.getDatabaseMetadata(); if ( databaseMetaData != null ) { try ( var statement = databaseMetaData.getConnection().createStatement() ) { - final ResultSet resultSet = statement.executeQuery( "SELECT @@options" ); + final var resultSet = statement.executeQuery( "SELECT @@options" ); if ( resultSet.next() ) { final byte[] optionBytes = resultSet.getBytes( 1 ); // By trial and error, enabling and disabling ansinull revealed that this bit is the indicator @@ -221,14 +218,14 @@ private static boolean isAnsiNull(DialectResolutionInfo info) { } } // default to the dialect-specific configuration setting - return getBoolean( SYBASE_ANSI_NULL, info.getConfigurationValues(), false ); + return getBoolean( SYBASE_ANSI_NULL, info.getConfigurationValues() ); } private int pageSize(DialectResolutionInfo info) { - final DatabaseMetaData databaseMetaData = info.getDatabaseMetadata(); + final var databaseMetaData = info.getDatabaseMetadata(); if ( databaseMetaData != null ) { try ( var statement = databaseMetaData.getConnection().createStatement() ) { - final ResultSet resultSet = statement.executeQuery( "SELECT @@maxpagesize" ); + final var resultSet = statement.executeQuery( "SELECT @@maxpagesize" ); if ( resultSet.next() ) { return resultSet.getInt( 1 ); } @@ -296,8 +293,7 @@ public boolean supportsDistinctFromPredicate() { public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) { super.contributeTypes( typeContributions, serviceRegistry ); - final JdbcTypeRegistry jdbcTypeRegistry = typeContributions.getTypeConfiguration() - .getJdbcTypeRegistry(); + final var jdbcTypeRegistry = typeContributions.getTypeConfiguration().getJdbcTypeRegistry(); jdbcTypeRegistry.addDescriptor( Types.BOOLEAN, TinyIntJdbcType.INSTANCE ); jdbcTypeRegistry.addDescriptor( Types.TIMESTAMP_WITH_TIMEZONE, TimestampJdbcType.INSTANCE ); } diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/HiLoOptimizer.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/HiLoOptimizer.java index f7d6591da04c..774eebd353bb 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/HiLoOptimizer.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/HiLoOptimizer.java @@ -119,6 +119,12 @@ else if ( ! generationState.upperLimit.gt( generationState.value ) ) { private GenerationState noTenantState; private Map tenantSpecificState; + @Override + public void reset() { + noTenantState = null; + tenantSpecificState = null; + } + private GenerationState locateGenerationState(String tenantId) { if ( tenantId == null ) { if ( noTenantState == null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/LegacyHiLoAlgorithmOptimizer.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/LegacyHiLoAlgorithmOptimizer.java index 124b8d4853ec..1559e6cb0b6b 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/LegacyHiLoAlgorithmOptimizer.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/LegacyHiLoAlgorithmOptimizer.java @@ -80,6 +80,12 @@ public Serializable generate(AccessCallback callback) { private GenerationState noTenantState; private Map tenantSpecificState; + @Override + public void reset() { + noTenantState = null; + tenantSpecificState = null; + } + private GenerationState locateGenerationState(String tenantIdentifier) { if ( tenantIdentifier == null ) { if ( noTenantState == null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/NoopOptimizer.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/NoopOptimizer.java index 46dbb30751ed..0d6204daa126 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/NoopOptimizer.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/NoopOptimizer.java @@ -31,7 +31,7 @@ public NoopOptimizer(Class returnClass, int incrementSize) { @Override public Serializable generate(AccessCallback callback) { - // IMPL NOTE : this method is called concurrently and is + // IMPL NOTE: this method is called concurrently and is // not synchronized. It is very important to work on the // local variable: the field lastSourceValue is not // reliable as it might be mutated by multiple threads. @@ -59,4 +59,9 @@ public boolean applyIncrementSizeToSourceValues() { public Expression createLowValueExpression(Expression databaseValue, SessionFactoryImplementor sessionFactory) { return databaseValue; } + + @Override + public void reset() { + lastSourceValue = null; + } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/Optimizer.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/Optimizer.java index b5f18d25329e..ba28fc7fc31c 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/Optimizer.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/Optimizer.java @@ -11,14 +11,15 @@ import java.io.Serializable; /** - * Performs optimization on an optimizable identifier generator. Typically + * Performs optimization on an optimizable identifier generator. Typically. * this optimization takes the form of trying to ensure we do not have to * hit the database on each and every request to get an identifier value. *

- * Optimizers work on constructor injection. They should provide - * a constructor with the following arguments

    - *
  1. java.lang.Class - The return type for the generated values
  2. - *
  3. int - The increment size
  4. + * Optimizers work on constructor injection. They should provide a + * constructor accepting the following arguments: + *
      + *
    1. {@code java.lang.Class} - The return type for the generated values
    2. + *
    3. {@code int} - The increment size
    4. *
    * * @author Steve Ebersole @@ -35,6 +36,13 @@ public interface Optimizer { */ Serializable generate(AccessCallback callback); + /** + * Reset the optimizer before restarting the underlying database sequence. + * + * @since 7.2 + */ + void reset(); + /** * A common means to access the last value obtained from the underlying * source. This is intended for testing purposes, since accessing the diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoOptimizer.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoOptimizer.java index a773f45318d1..9504a5a04686 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoOptimizer.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoOptimizer.java @@ -78,6 +78,12 @@ public Serializable generate(AccessCallback callback) { private GenerationState noTenantState; private Map tenantSpecificState; + @Override + public void reset() { + noTenantState = null; + tenantSpecificState = null; + } + private GenerationState locateGenerationState(String tenantIdentifier) { if ( tenantIdentifier == null ) { if ( noTenantState == null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoThreadLocalOptimizer.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoThreadLocalOptimizer.java index cf3e8a26ea3d..d975658bdeba 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoThreadLocalOptimizer.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoThreadLocalOptimizer.java @@ -64,6 +64,12 @@ private GenerationState locateGenerationState(String tenantIdentifier) { } } + @Override + public void reset() { + singleTenantState.remove(); + multiTenantStates.remove(); + } + // for Hibernate testsuite use only private GenerationState noTenantGenerationState() { final var noTenantState = locateGenerationState( null ); diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledOptimizer.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledOptimizer.java index 8e631e4fc7b6..5aa17e674e82 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledOptimizer.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledOptimizer.java @@ -56,7 +56,6 @@ public PooledOptimizer(Class returnClass, int incrementSize) { OPTIMIZER_MESSAGE_LOGGER.creatingPooledOptimizer( incrementSize, returnClass.getName() ); } - @Override public Serializable generate(AccessCallback callback) { lock.lock(); @@ -99,6 +98,12 @@ else if ( generationState.value.gt( generationState.hiValue ) ) { private GenerationState noTenantState; private Map tenantSpecificState; + @Override + public void reset() { + noTenantState = null; + tenantSpecificState = null; + } + private GenerationState locateGenerationState(String tenantIdentifier) { if ( tenantIdentifier == null ) { if ( noTenantState == null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java index 034ac27c2b4d..5f7e8399055c 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java @@ -9,6 +9,7 @@ import org.hibernate.AssertionFailure; import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.model.relational.InitCommand; +import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.boot.model.relational.Sequence; import org.hibernate.boot.model.relational.SqlStringGenerationContext; @@ -178,9 +179,16 @@ public void registerExtraExportables(Table table, Optimizer optimizer) { final long max = getMaxPrimaryKey( isolator, primaryKeyColumnName, tableName ); final long current = getNextSequenceValue( isolator, sequenceName); final long startWith = Math.max( max + adjustment, current ); + optimizer.reset(); return new InitCommand( sqlContext.getDialect().getSequenceSupport() .getRestartSequenceString( sequenceName, startWith ) ); } ); + table.addResetCommand( sqlContext -> { + optimizer.reset(); + final String sequenceName = sqlContext.format( physicalSequenceName ); + return new InitCommand( sqlContext.getDialect().getSequenceSupport() + .getRestartSequenceString( sequenceName, initialValue ) ); + } ); } @Override @@ -197,18 +205,24 @@ protected QualifiedName getQualifiedName() { } protected void buildSequence(Database database) { - final var namespace = database.locateNamespace( - logicalQualifiedSequenceName.getCatalogName(), - logicalQualifiedSequenceName.getSchemaName() - ); + final var sequence = + locateOrCreateSequence( database.locateNamespace( + logicalQualifiedSequenceName.getCatalogName(), + logicalQualifiedSequenceName.getSchemaName() + ) ); + physicalSequenceName = sequence.getName(); + } + + private Sequence locateOrCreateSequence(Namespace namespace) { final int sourceIncrementSize = getSourceIncrementSize(); final var objectName = logicalQualifiedSequenceName.getObjectName(); - Sequence sequence = namespace.locateSequence( objectName ); - if ( sequence != null ) { - sequence.validate( initialValue, sourceIncrementSize ); + final var existingSequence = namespace.locateSequence( objectName ); + if ( existingSequence != null ) { + existingSequence.validate( initialValue, sourceIncrementSize ); + return existingSequence; } else { - sequence = namespace.createSequence( + return namespace.createSequence( objectName, physicalName -> new Sequence( contributor, @@ -221,6 +235,5 @@ protected void buildSequence(Database database) { ) ); } - physicalSequenceName = sequence.getName(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java index b25fd47a792a..5a106fbfaef5 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java @@ -445,7 +445,7 @@ protected OptimizerDescriptor determineOptimizationStrategy(Properties params, i * selected optimizer. This is the hook to achieve that. * * @param optimizationStrategy The optimizer strategy (name) - * @param incrementSize The {@link #determineIncrementSize determined increment size} + * @param incrementSize The {@linkplain #determineIncrementSize determined increment size} * @return The adjusted increment size. */ protected int determineAdjustedIncrementSize(OptimizerDescriptor optimizationStrategy, int incrementSize) { diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java index 554ffc234bf2..1d6e1ec3c08a 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java @@ -703,6 +703,7 @@ public void registerExportables(Database database) { physicalTableName = table.getQualifiedTableName(); table.addInitCommand( this::generateInsertInitCommand ); table.addResyncCommand( this::generateResyncCommand ); + table.addResetCommand( this::generateResetCommand ); } private InitCommand generateResyncCommand(SqlStringGenerationContext context, DdlTransactionIsolator isolator) { @@ -715,6 +716,7 @@ private InitCommand generateResyncCommand(SqlStringGenerationContext context, Dd getCurrentTableValue( isolator, sequenceTableName, valueColumnName, segmentColumnName, segmentValue ); if ( max + adjustment > current ) { + optimizer.reset(); final String update = "update " + sequenceTableName + " set " + valueColumnName + " = " + (max + adjustment) @@ -726,6 +728,15 @@ private InitCommand generateResyncCommand(SqlStringGenerationContext context, Dd } } + private InitCommand generateResetCommand(SqlStringGenerationContext context) { + optimizer.reset(); + final String update = + "update " + context.format( physicalTableName ) + + " set " + valueColumnName + " = " + initialValue + + " where " + segmentColumnName + " = '" + segmentValue + "'"; + return new InitCommand( update ); + } + private Table createTable(Database database, Namespace namespace) { final var table = namespace.createTable( qualifiedTableName.getObjectName(), diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java index e4371440cf11..208aae6c3488 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java @@ -338,14 +338,15 @@ public void initialize(SqlStringGenerationContext context) { @Override public void registerExtraExportables(Table table, Optimizer optimizer) { - table.addResyncCommand( (context, isolator) -> { - final String sequenceTableName = context.format( physicalTableName ); - final String tableName = context.format( table.getQualifiedTableName() ); + table.addResyncCommand( (sqlContext, isolator) -> { + final String sequenceTableName = sqlContext.format( physicalTableName ); + final String tableName = sqlContext.format( table.getQualifiedTableName() ); final String primaryKeyColumnName = table.getPrimaryKey().getColumn( 0 ).getName(); final int adjustment = optimizer.getAdjustment(); final long max = getMaxPrimaryKey( isolator, primaryKeyColumnName, tableName ); final long current = getCurrentTableValue( isolator, sequenceTableName, valueColumnNameText ); if ( max + adjustment > current ) { + optimizer.reset(); final String update = "update " + sequenceTableName + " set " + valueColumnNameText + " = " + (max + adjustment); @@ -355,5 +356,12 @@ public void registerExtraExportables(Table table, Optimizer optimizer) { return new InitCommand(); } } ); + table.addResetCommand( sqlContext -> { + optimizer.reset(); + final String update = + "update " + sqlContext.format( physicalTableName ) + + " set " + valueColumnNameText + " = " + initialValue; + return new InitCommand( update ); + } ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/jpa/boot/internal/EntityManagerFactoryBuilderImpl.java b/hibernate-core/src/main/java/org/hibernate/jpa/boot/internal/EntityManagerFactoryBuilderImpl.java index 0e8f88a90930..8d82e0320a57 100644 --- a/hibernate-core/src/main/java/org/hibernate/jpa/boot/internal/EntityManagerFactoryBuilderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/jpa/boot/internal/EntityManagerFactoryBuilderImpl.java @@ -263,7 +263,7 @@ private static Map mergedIntegrationSettings( private static void ignoreFlushBeforeCompletion(MergedSettings mergedSettings) { // flush before completion validation final var config = mergedSettings.getConfigurationValues(); - if ( getBoolean( FLUSH_BEFORE_COMPLETION, config, false ) ) { + if ( getBoolean( FLUSH_BEFORE_COMPLETION, config ) ) { JPA_LOGGER.definingFlushBeforeCompletionIgnoredInHem( FLUSH_BEFORE_COMPLETION ); config.put( FLUSH_BEFORE_COMPLETION, String.valueOf(false) ); } diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Table.java b/hibernate-core/src/main/java/org/hibernate/mapping/Table.java index aceb43ae8820..04d3f60d8a6b 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Table.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Table.java @@ -75,6 +75,7 @@ public class Table implements Serializable, ContributableDatabaseObject { private List> initCommandProducers; private List> resyncCommandProducers; + private List> resetCommandProducers; @Deprecated(since="6.2", forRemoval = true) public Table() { @@ -833,7 +834,22 @@ public List getResyncCommands(SqlStringGenerationContext context, D .map( producer -> producer.apply( context, isolator ) ) .distinct() .toList(); + } + + public void addResetCommand(Function commandProducer) { + if ( resetCommandProducers == null ) { + resetCommandProducers = new ArrayList<>(); + } + resetCommandProducers.add( commandProducer ); + } + public List getResetCommands(SqlStringGenerationContext context) { + return resetCommandProducers == null + ? emptyList() + : resetCommandProducers.stream() + .map( producer -> producer.apply( context ) ) + .distinct() + .toList(); } public String getOptions() { diff --git a/hibernate-core/src/main/java/org/hibernate/relational/SchemaManager.java b/hibernate-core/src/main/java/org/hibernate/relational/SchemaManager.java index 732df9a060cd..c4ef4cbf9f71 100644 --- a/hibernate-core/src/main/java/org/hibernate/relational/SchemaManager.java +++ b/hibernate-core/src/main/java/org/hibernate/relational/SchemaManager.java @@ -67,7 +67,9 @@ public interface SchemaManager extends jakarta.persistence.SchemaManager { void validateMappedObjects(); /** - * Truncate the database tables mapped by Hibernate entities, and then + * Truncate the database tables mapped by Hibernate entities, reset all associated + * {@linkplain jakarta.persistence.SequenceGenerator sequences} and tables backing + * {@linkplain jakarta.persistence.TableGenerator table generators}, and then * reimport initial data from {@code /import.sql} and any other configured * {@linkplain org.hibernate.cfg.AvailableSettings#JAKARTA_HBM2DDL_LOAD_SCRIPT_SOURCE * load script}. @@ -88,6 +90,10 @@ public interface SchemaManager extends jakarta.persistence.SchemaManager { * {@linkplain org.hibernate.cfg.AvailableSettings#JAKARTA_HBM2DDL_LOAD_SCRIPT_SOURCE * load script}. *

    + * This operation does not automatically resynchronize sequences or tables backing + * {@linkplain jakarta.persistence.TableGenerator table generators}, and so it might + * be necessary to call {@link #resynchronizeGenerators} after calling this method. + *

    * Programmatic way to run {@link org.hibernate.tool.schema.spi.SchemaPopulator}. * * @since 7.0 diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaPopulator.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaPopulator.java index b368b060dbe9..f5449c227c24 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaPopulator.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaPopulator.java @@ -67,7 +67,7 @@ private String getDefaultImportFile(ExecutionOptions options) { } private static boolean skipDefaultFileImport(ExecutionOptions options) { - return getBoolean( HBM2DDL_SKIP_DEFAULT_IMPORT_FILE, options.getConfigurationValues(), false ); + return getBoolean( HBM2DDL_SKIP_DEFAULT_IMPORT_FILE, options.getConfigurationValues() ); } /** @@ -101,7 +101,8 @@ private boolean applyImportScript( final Object importScriptSetting = getImportScriptSetting( options ); if ( importScriptSetting != null ) { final var importScriptInput = - interpretScriptSourceSetting( importScriptSetting, getClassLoaderService(), getCharsetName( options ) ); + interpretScriptSourceSetting( importScriptSetting, + getClassLoaderService(), getCharsetName( options ) ); applyScript( options, commandExtractor, diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/GeneratorSynchronizerImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/GeneratorSynchronizerImpl.java index a414b559446a..a7b6437ed5fe 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/GeneratorSynchronizerImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/GeneratorSynchronizerImpl.java @@ -102,8 +102,12 @@ private void syncFromMetadata( for ( var namespace : metadata.getDatabase().getNamespaces() ) { if ( schemaFilter.includeNamespace( namespace ) ) { for ( var table : namespace.getTables() ) { - for ( var command : table.getResyncCommands( context, isolator ) ) { - applySqlStrings( command.initCommands(), formatter, options, targets ); + if ( table.isPhysicalTable() + && schemaFilter.includeTable( table ) + && contributableInclusionFilter.matches( table ) ) { + for ( var command : table.getResyncCommands( context, isolator ) ) { + applySqlStrings( command.initCommands(), formatter, options, targets ); + } } } } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaTruncatorImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaTruncatorImpl.java index 87fd05fe66f5..860f4f5423dd 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaTruncatorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaTruncatorImpl.java @@ -13,7 +13,6 @@ import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.internal.FormatStyle; import org.hibernate.engine.jdbc.internal.Formatter; -import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.mapping.Table; import org.hibernate.tool.schema.spi.GenerationTarget; import org.hibernate.tool.schema.spi.ContributableMatcher; @@ -29,6 +28,7 @@ import java.util.List; import java.util.Set; +import static org.hibernate.internal.util.collections.CollectionHelper.setOfSize; import static org.hibernate.tool.schema.internal.Helper.applySqlString; import static org.hibernate.tool.schema.internal.Helper.applySqlStrings; import static org.hibernate.tool.schema.internal.Helper.createSqlStringGenerationContext; @@ -110,9 +110,9 @@ private void truncateFromMetadata( Formatter formatter, GenerationTarget... targets) { final var database = metadata.getDatabase(); - SqlStringGenerationContext context = createSqlStringGenerationContext( options, metadata ); + final var context = createSqlStringGenerationContext( options, metadata ); - final Set exportIdentifiers = CollectionHelper.setOfSize( 50 ); + final Set exportIdentifiers = setOfSize( 50 ); for ( var namespace : database.getNamespaces() ) { if ( schemaFilter.includeNamespace( namespace ) ) { @@ -121,38 +121,25 @@ private void truncateFromMetadata( applySqlString( dialect.getTableCleaner().getSqlBeforeString(), formatter, options, targets ); // now it's safe to drop the tables - List list = new ArrayList<>( namespace.getTables().size() ); - for ( Table table : namespace.getTables() ) { - if ( !table.isPhysicalTable() ) { - continue; + final List
    tablesToTruncate = new ArrayList<>( namespace.getTables().size() ); + for ( var table : namespace.getTables() ) { + if ( table.isPhysicalTable() + && schemaFilter.includeTable( table ) + && contributableInclusionFilter.matches( table ) ) { + checkExportIdentifier( table, exportIdentifiers ); + tablesToTruncate.add( table ); } - if ( !schemaFilter.includeTable( table ) ) { - continue; - } - if ( !contributableInclusionFilter.matches( table ) ) { - continue; - } - checkExportIdentifier( table, exportIdentifiers ); - list.add( table ); } applySqlStrings( - dialect.getTableCleaner().getSqlTruncateStrings( list, metadata, context ), + dialect.getTableCleaner().getSqlTruncateStrings( tablesToTruncate, metadata, context ), formatter, options, targets ); - - //TODO: reset the sequences? -// for ( var sequence : namespace.getSequences() ) { -// if ( ! options.getSchemaFilter().includeSequence( sequence ) ) { -// continue; -// } -// if ( ! contributableInclusionFilter.matches( sequence ) ) { -// continue; -// } -// checkExportIdentifier( sequence, exportIdentifiers ); -// -// applySqlStrings( dialect.getSequenceExporter().getSqlDropStrings( sequence, metadata, context ), -// formatter, options, targets ); -// } + // reset sequences back to their initial values + for ( var table : tablesToTruncate ) { + for ( var command : table.getResetCommands( context ) ) { + applySqlStrings( command.initCommands(), formatter, options, targets ); + } + } applySqlString( dialect.getTableCleaner().getSqlAfterString(), formatter, options, targets ); enableConstraints( namespace, metadata, formatter, options, schemaFilter, context, @@ -175,7 +162,6 @@ private void disableConstraints( ContributableMatcher contributableInclusionFilter, GenerationTarget... targets) { final var dialect = metadata.getDatabase().getJdbcEnvironment().getDialect(); - for ( var table : namespace.getTables() ) { if ( table.isPhysicalTable() && schemaFilter.includeTable( table ) @@ -213,8 +199,8 @@ private void enableConstraints( SqlStringGenerationContext context, ContributableMatcher contributableInclusionFilter, GenerationTarget... targets) { - final Dialect dialect = metadata.getDatabase().getJdbcEnvironment().getDialect(); - for ( Table table : namespace.getTables() ) { + final var dialect = metadata.getDatabase().getJdbcEnvironment().getDialect(); + for ( var table : namespace.getTables() ) { if ( table.isPhysicalTable() && schemaFilter.includeTable( table ) && contributableInclusionFilter.matches( table ) ) { diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableCleaner.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableCleaner.java index de9f4018e8d2..070c77e3a26b 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableCleaner.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableCleaner.java @@ -6,11 +6,9 @@ import org.hibernate.Incubating; import org.hibernate.boot.Metadata; -import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.QualifiedNameParser; import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; -import org.hibernate.internal.util.collections.ArrayHelper; import org.hibernate.mapping.ForeignKey; import org.hibernate.mapping.Table; import org.hibernate.tool.schema.spi.Cleaner; @@ -18,7 +16,7 @@ import java.util.Collection; import static java.util.Arrays.stream; -import static java.util.stream.Collectors.toList; +import static org.hibernate.boot.model.naming.Identifier.toIdentifier; import static org.hibernate.internal.util.collections.ArrayHelper.join; /** @@ -46,16 +44,16 @@ public String getSqlAfterString() { @Override public String[] getSqlTruncateStrings(Collection
    tables, Metadata metadata, SqlStringGenerationContext context) { - String[] tableNames = tables.stream() - .map( table -> context.format( getTableName( table ) ) ) - .collect( toList() ) - .toArray( ArrayHelper.EMPTY_STRING_ARRAY ); - String[] truncateTableStatements = dialect.getTruncateTableStatements( tableNames ); - String[] initStatements = tables.stream() - .flatMap( table -> table.getInitCommands( context ).stream() ) - .flatMap( command -> stream( command.initCommands() ) ) - .toList() - .toArray( ArrayHelper.EMPTY_STRING_ARRAY ); + final String[] tableNames = + tables.stream() + .map( table -> context.format( getTableName( table ) ) ) + .toArray( String[]::new ); + final String[] truncateTableStatements = dialect.getTruncateTableStatements( tableNames ); + final String[] initStatements = + tables.stream() + .flatMap( table -> table.getInitCommands( context ).stream() ) + .flatMap( command -> stream( command.initCommands() ) ) + .toArray( String[]::new ); return join( truncateTableStatements, initStatements ); } @@ -71,8 +69,8 @@ public String getSqlEnableConstraintString(ForeignKey foreignKey, Metadata metad private static QualifiedNameParser.NameParts getTableName(Table table) { return new QualifiedNameParser.NameParts( - Identifier.toIdentifier(table.getCatalog(), table.isCatalogQuoted()), - Identifier.toIdentifier(table.getSchema(), table.isSchemaQuoted()), + toIdentifier( table.getCatalog(), table.isCatalogQuoted() ), + toIdentifier( table.getSchema(), table.isSchemaQuoted() ), table.getNameIdentifier() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java index 2452b9b9e4d1..1f5f17dd8c94 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java @@ -9,7 +9,6 @@ import org.hibernate.MappingException; import org.hibernate.boot.Metadata; -import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.boot.model.relational.QualifiedNameParser; import org.hibernate.boot.model.relational.QualifiedTableName; @@ -30,6 +29,7 @@ import static java.util.Collections.addAll; import static java.util.Comparator.comparing; +import static org.hibernate.boot.model.naming.Identifier.toIdentifier; import static org.hibernate.internal.util.StringHelper.EMPTY_STRINGS; import static org.hibernate.internal.util.StringHelper.isNotEmpty; import static org.hibernate.tool.schema.internal.ColumnDefinitions.appendColumn; @@ -57,7 +57,7 @@ public String[] getSqlCreateStrings( try { final String formattedTableName = context.format( tableName ); - final StringBuilder createTable = new StringBuilder(); + final var createTable = new StringBuilder(); final String viewQuery = table.getViewQuery(); if ( viewQuery != null ) { @@ -85,7 +85,7 @@ public String[] getSqlCreateStrings( .append( viewQuery ); } else { - final StringBuilder extra = new StringBuilder(); + final var extra = new StringBuilder(); createTable.append( tableCreateString( table.hasPrimaryKey() ) ) .append( ' ' ) @@ -105,7 +105,7 @@ public String[] getSqlCreateStrings( extra.append( column.getValue().getExtraCreateTableInfo() ); } if ( table.getRowId() != null ) { - String rowIdColumn = dialect.getRowIdColumnString( table.getRowId() ); + final String rowIdColumn = dialect.getRowIdColumnString( table.getRowId() ); if ( rowIdColumn != null ) { createTable.append(", ").append( rowIdColumn ); } @@ -165,12 +165,13 @@ protected void applyComments(Table table, QualifiedTableName tableName, List sqlStrings) { if ( dialect.supportsCommentOn() ) { - if ( table.getComment() != null && dialect.getTableComment( "" ).isEmpty() ) { - sqlStrings.add( "comment on table " + formattedTableName + " is '" + table.getComment() + "'" ); + final String comment = table.getComment(); + if ( comment != null && dialect.getTableComment( "" ).isEmpty() ) { + sqlStrings.add( "comment on table " + formattedTableName + " is '" + comment + "'" ); } if ( dialect.getColumnComment( "" ).isEmpty() ){ - for ( Column column : table.getColumns() ) { - String columnComment = column.getComment(); + for ( var column : table.getColumns() ) { + final String columnComment = column.getComment(); if ( columnComment != null ) { sqlStrings.add( "comment on column " + formattedTableName + '.' + column.getQuotedName( dialect ) @@ -252,7 +253,7 @@ protected void applyTableCheck(Table table, StringBuilder buf) { } private boolean isArray(AggregateColumn aggregateColumn) { - final BasicValue value = (BasicValue) aggregateColumn.getValue(); + final var value = (BasicValue) aggregateColumn.getValue(); return switch ( value.getResolution().getJdbcType().getDefaultSqlTypeCode() ) { case SqlTypes.STRUCT_ARRAY, SqlTypes.STRUCT_TABLE, SqlTypes.JSON_ARRAY, SqlTypes.XML_ARRAY, SqlTypes.ARRAY -> true; @@ -395,7 +396,7 @@ protected String primaryKeyString(PrimaryKey key) { } constraint.append( "primary key (" ); boolean first = true; - for ( Column column : key.getColumns() ) { + for ( var column : key.getColumns() ) { if ( first ) { first = false; } @@ -429,8 +430,8 @@ public String[] getSqlDropStrings(Table table, Metadata metadata, SqlStringGener private static QualifiedName getTableName(Table table) { return new QualifiedNameParser.NameParts( - Identifier.toIdentifier( table.getCatalog(), table.isCatalogQuoted() ), - Identifier.toIdentifier( table.getSchema(), table.isSchemaQuoted() ), + toIdentifier( table.getCatalog(), table.isCatalogQuoted() ), + toIdentifier( table.getSchema(), table.isSchemaQuoted() ), table.getNameIdentifier() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableMigrator.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableMigrator.java index cc59a7ec224d..06a91628601f 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableMigrator.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableMigrator.java @@ -8,12 +8,10 @@ import org.hibernate.Incubating; import org.hibernate.Internal; import org.hibernate.boot.Metadata; -import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.QualifiedTableName; import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.mapping.Table; -import org.hibernate.tool.schema.extract.spi.ColumnInformation; import org.hibernate.tool.schema.extract.spi.TableInformation; import org.hibernate.tool.schema.spi.TableMigrator; import org.jboss.logging.Logger; @@ -21,6 +19,7 @@ import java.util.ArrayList; import java.util.List; +import static org.hibernate.boot.model.naming.Identifier.toIdentifier; import static org.hibernate.internal.util.collections.ArrayHelper.EMPTY_STRING_ARRAY; import static org.hibernate.tool.schema.internal.ColumnDefinitions.getColumnDefinition; import static org.hibernate.tool.schema.internal.ColumnDefinitions.hasMatchingLength; @@ -67,35 +66,32 @@ public static List sqlAlterStrings( TableInformation tableInformation, SqlStringGenerationContext context) throws HibernateException { - final String tableName = context.format( new QualifiedTableName( - Identifier.toIdentifier( table.getCatalog(), table.isCatalogQuoted() ), - Identifier.toIdentifier( table.getSchema(), table.isSchemaQuoted() ), - table.getNameIdentifier() ) - ); + final String tableName = getTableName( table, context ); final String alterTable = dialect.getAlterTableString( tableName ) + ' '; final List results = new ArrayList<>(); for ( var column : table.getColumns() ) { - final ColumnInformation columnInformation = tableInformation.getColumn( - Identifier.toIdentifier( column.getName(), column.isQuoted() ) - ); + final var columnInformation = + tableInformation.getColumn( toIdentifier( column.getName(), column.isQuoted() ) ); if ( columnInformation == null ) { - // the column doesn't exist at all. - final String addColumn = dialect.getAddColumnString() + ' ' - + getFullColumnDeclaration( column, table, metadata, dialect, context ) - + dialect.getAddColumnSuffixString(); + // the column doesn't exist at all + final String addColumn = + dialect.getAddColumnString() + ' ' + + getFullColumnDeclaration( column, table, metadata, dialect, context ) + + dialect.getAddColumnSuffixString(); results.add( alterTable + addColumn ); } else if ( dialect.supportsAlterColumnType() ) { if ( !hasMatchingType( column, columnInformation, metadata, dialect ) || !hasMatchingLength( column, columnInformation, metadata, dialect ) ) { - final String alterColumn = dialect.getAlterColumnTypeString( - column.getQuotedName( dialect ), - column.getSqlType(metadata), - getColumnDefinition( column, metadata, dialect ) - ); + final String alterColumn = + dialect.getAlterColumnTypeString( + column.getQuotedName( dialect ), + column.getSqlType(metadata), + getColumnDefinition( column, metadata, dialect ) + ); results.add( alterTable + alterColumn ); } } @@ -107,4 +103,12 @@ else if ( dialect.supportsAlterColumnType() ) { return results; } + + private static String getTableName(Table table, SqlStringGenerationContext context) { + return context.format( new QualifiedTableName( + toIdentifier( table.getCatalog(), table.isCatalogQuoted() ), + toIdentifier( table.getSchema(), table.isSchemaQuoted() ), + table.getNameIdentifier() ) + ); + } } diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/jdbc/SQLStatementInterceptor.java b/hibernate-testing/src/main/java/org/hibernate/testing/jdbc/SQLStatementInterceptor.java index 96bc622f1aa9..3331e355f9f6 100644 --- a/hibernate-testing/src/main/java/org/hibernate/testing/jdbc/SQLStatementInterceptor.java +++ b/hibernate-testing/src/main/java/org/hibernate/testing/jdbc/SQLStatementInterceptor.java @@ -9,11 +9,11 @@ import org.hibernate.boot.SessionFactoryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.Configuration; import org.hibernate.internal.util.PropertiesHelper; import org.hibernate.resource.jdbc.spi.StatementInspector; +import static org.hibernate.cfg.JdbcSettings.STATEMENT_INSPECTOR; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -26,28 +26,21 @@ public class SQLStatementInterceptor { private final LinkedList sqlQueries = new LinkedList<>(); + private final StatementInspector inspector = sql -> { + sqlQueries.add( sql ); + return sql; + }; + public SQLStatementInterceptor(SessionFactoryBuilder sessionFactoryBuilder) { - sessionFactoryBuilder.applyStatementInspector( (StatementInspector) sql -> { - sqlQueries.add( sql ); - return sql; - } ); + sessionFactoryBuilder.applyStatementInspector( inspector ); } public SQLStatementInterceptor(Map settings) { - settings.put( AvailableSettings.STATEMENT_INSPECTOR, (StatementInspector) sql -> { - sqlQueries.add( sql ); - return sql; - } ); + settings.put( STATEMENT_INSPECTOR, inspector ); } - public SQLStatementInterceptor(StandardServiceRegistryBuilder ssrb) { - ssrb.applySetting( - AvailableSettings.STATEMENT_INSPECTOR, - (StatementInspector) sql -> { - sqlQueries.add( sql ); - return sql; - } - ); + public SQLStatementInterceptor(StandardServiceRegistryBuilder registryBuilder) { + registryBuilder.applySetting( STATEMENT_INSPECTOR, inspector ); } public SQLStatementInterceptor(Configuration configuration) {