HHH-18337 Account for physical naming strategy when querying db sequence

This commit is contained in:
Marco Belladelli 2024-08-01 10:53:55 +02:00 committed by Steve Ebersole
parent 7c66788c93
commit 88bcc7140d
3 changed files with 20 additions and 4 deletions

View File

@ -54,6 +54,8 @@ import org.hibernate.boot.spi.InFlightMetadataCollector;
import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.boot.spi.PropertyData;
import org.hibernate.engine.OptimisticLockStyle;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.PersistentIdentifierGenerator;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.mapping.Collection;
import org.hibernate.mapping.Component;
@ -1441,6 +1443,14 @@ public class PropertyBinder {
? serviceRegistry.requireService( ManagedBeanRegistry.class ).getBeanContainer()
: null;
idValue.setCustomIdGeneratorCreator( identifierGeneratorCreator( idProperty, annotation, beanContainer ) );
final Map<String,Object> parameters = new HashMap<>();
parameters.put( PersistentIdentifierGenerator.TABLE, idValue.getTable().getName() );
if ( idValue.getColumnSpan() == 1 ) {
parameters.put( PersistentIdentifierGenerator.PK, idValue.getColumns().get(0).getName() );
}
// YUCK! but cannot think of a clean way to do this given the string-config based scheme
parameters.put( PersistentIdentifierGenerator.IDENTIFIER_NORMALIZER, context.getObjectNameNormalizer() );
idValue.setIdentifierGeneratorParameters( parameters );
}
else if ( !generatorAnnotations.isEmpty() ) {
// idValue.setCustomGeneratorCreator( generatorCreator( idProperty, generatorAnnotation ) );

View File

@ -34,7 +34,7 @@ public abstract class ObjectNameNormalizer {
return database().toIdentifier( identifierText );
}
protected Database database() {
public Database database() {
if ( database == null ) {
database = getBuildingContext().getMetadataCollector().getDatabase();
}

View File

@ -15,6 +15,7 @@ import java.util.Set;
import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.ObjectNameNormalizer;
import org.hibernate.boot.model.relational.Database;
import org.hibernate.boot.model.relational.QualifiedName;
import org.hibernate.boot.model.relational.QualifiedNameParser;
@ -216,7 +217,8 @@ public class SequenceStyleGenerator
physicalSequence,
optimizationStrategy,
serviceRegistry,
determineContributor( parameters )
determineContributor( parameters ),
(ObjectNameNormalizer) parameters.get( IDENTIFIER_NORMALIZER )
);
if ( physicalSequence
@ -251,7 +253,8 @@ public class SequenceStyleGenerator
boolean physicalSequence,
OptimizerDescriptor optimizationStrategy,
ServiceRegistry serviceRegistry,
String contributor) {
String contributor,
ObjectNameNormalizer normalizer) {
final ConfigurationService configurationService = serviceRegistry.requireService( ConfigurationService.class );
final SequenceMismatchStrategy sequenceMismatchStrategy = configurationService.getSetting(
AvailableSettings.SEQUENCE_INCREMENT_SIZE_MISMATCH_STRATEGY,
@ -262,7 +265,10 @@ public class SequenceStyleGenerator
if ( sequenceMismatchStrategy != SequenceMismatchStrategy.NONE
&& optimizationStrategy.isPooled()
&& physicalSequence ) {
final String databaseSequenceName = sequenceName.getObjectName().getText();
final String databaseSequenceName = normalizer.database()
.getPhysicalNamingStrategy()
.toPhysicalSequenceName( sequenceName.getObjectName(), jdbcEnvironment )
.getText();
final Number databaseIncrementValue = isSchemaToBeRecreated( contributor, configurationService ) ? null : getSequenceIncrementValue( jdbcEnvironment, databaseSequenceName );
if ( databaseIncrementValue != null && databaseIncrementValue.intValue() != incrementSize) {
final int dbIncrementValue = databaseIncrementValue.intValue();