HHH-18139 deprecate IdentifierGeneratorFactory

Signed-off-by: Gavin King <gavin@hibernate.org>
This commit is contained in:
Gavin King 2024-05-18 21:44:14 +02:00 committed by Steve Ebersole
parent 7f3b777cd1
commit 46dd56c715
16 changed files with 67 additions and 107 deletions

View File

@ -2261,11 +2261,7 @@ public class InFlightMetadataCollectorImpl implements InFlightMetadataCollector,
// It was done this way in the old code too, so no "regression" here; but
// it could be done better
try {
final Generator generator = identifierValueBinding.createGenerator(
bootstrapContext.getIdentifierGeneratorFactory(),
dialect,
entityBinding
);
final Generator generator = identifierValueBinding.createGenerator( dialect, entityBinding );
if ( generator instanceof ExportableProducer ) {
( (ExportableProducer) generator ).registerExportables( getDatabase() );

View File

@ -7,7 +7,6 @@
package org.hibernate.boot.internal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.Callable;
@ -63,7 +62,6 @@ import org.hibernate.cfg.AvailableSettings;
import org.hibernate.dialect.Dialect;
import org.hibernate.dialect.TimeZoneSupport;
import org.hibernate.engine.config.spi.ConfigurationService;
import org.hibernate.engine.config.spi.StandardConverters;
import org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl;
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
@ -71,8 +69,6 @@ import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.log.DeprecationLogger;
import org.hibernate.internal.util.NullnessHelper;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.metamodel.CollectionClassification;
import org.hibernate.query.sqm.function.SqmFunctionDescriptor;
import org.hibernate.query.sqm.function.SqmFunctionRegistry;
@ -777,7 +773,7 @@ public class MetadataBuilderImpl implements MetadataBuilderImplementor, TypeCont
return mappingDefaults;
}
@Override
@Override @Deprecated
public IdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return identifierGeneratorFactory;
}

View File

@ -53,7 +53,7 @@ public abstract class AbstractDelegatingMetadataBuildingOptions implements Metad
return delegate.getMappingDefaults();
}
@Override
@Override @Deprecated
public IdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return delegate.getIdentifierGeneratorFactory();
}

View File

@ -75,6 +75,7 @@ public interface BootstrapContext {
*/
MetadataBuildingOptions getMetadataBuildingOptions();
@Deprecated(since="7.0", forRemoval = true)
default IdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return getMetadataBuildingOptions().getIdentifierGeneratorFactory();
}

View File

@ -50,7 +50,10 @@ public interface MetadataBuildingOptions {
* The service implementing {@link IdentifierGeneratorFactory}.
* <p>
* @implNote Almost always a {@link org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory}.
*
* @deprecated Use new {@link org.hibernate.generator.Generator} infrastructure
*/
@Deprecated(since="7.0", forRemoval = true)
IdentifierGeneratorFactory getIdentifierGeneratorFactory();
/**

View File

@ -44,8 +44,11 @@ import jakarta.persistence.GenerationType;
* {@link org.hibernate.annotations.IdGeneratorType @IdGeneratorType} meta-annotation.
*
* @author Steve Ebersole
*
* @deprecated Use new {@link Generator} infrastructure
*/
@Incubating //this API is currently in flux
@Deprecated(since = "7.0")
public interface IdentifierGeneratorFactory extends Service {
/**
* Create an {@link IdentifierGenerator} based on the given details.

View File

@ -57,7 +57,10 @@ import static org.hibernate.internal.log.DeprecationLogger.DEPRECATION_LOGGER;
* declared using {@link org.hibernate.annotations.GenericGenerator}.
*
* @author Steve Ebersole
*
* @deprecated Use new {@link Generator} infrastructure
*/
@Deprecated(since = "7.0")
public class StandardIdentifierGeneratorFactory
implements IdentifierGeneratorFactory, BeanContainer.LifecycleOptions, Serializable {

View File

@ -14,5 +14,8 @@
* It is used when id generators are identified by stringly-typed names.
*
* @see org.hibernate.id.factory.IdentifierGeneratorFactory
*
* @deprecated Use new {@link org.hibernate.generator.Generator} infrastructure
*/
@Deprecated(since = "7.0")
package org.hibernate.id.factory;

View File

@ -7,13 +7,11 @@
package org.hibernate.id.factory.spi;
import org.hibernate.Incubating;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.mapping.RootClass;
import org.hibernate.generator.GeneratorCreationContext;
import org.hibernate.mapping.RootClass;
@Incubating
public interface CustomIdGeneratorCreationContext extends GeneratorCreationContext {
IdentifierGeneratorFactory getIdentifierGeneratorFactory();
RootClass getRootClass();
// we could add these if it helps integrate old infrastructure

View File

@ -7,5 +7,8 @@
/**
* Contains an SPI for id generator factories.
*
* @deprecated Use new {@link org.hibernate.generator.Generator} infrastructure
*/
@Deprecated(since = "7.0")
package org.hibernate.id.factory.spi;

View File

@ -73,7 +73,6 @@ import org.hibernate.generator.Generator;
import org.hibernate.graph.spi.RootGraphImplementor;
import org.hibernate.id.Configurable;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.integrator.spi.Integrator;
import org.hibernate.integrator.spi.IntegratorService;
import org.hibernate.internal.util.StringHelper;
@ -288,7 +287,7 @@ public class SessionFactoryImpl extends QueryParameterBindingTypeResolverImpl im
try {
integrate( bootMetamodel, bootstrapContext, integratorObserver );
identifierGenerators = createGenerators( jdbcServices, sqlStringGenerationContext, bootMetamodel, bootstrapContext );
identifierGenerators = createGenerators( jdbcServices, sqlStringGenerationContext, bootMetamodel );
bootMetamodel.orderColumns( false );
bootMetamodel.validate();
@ -463,26 +462,22 @@ public class SessionFactoryImpl extends QueryParameterBindingTypeResolverImpl im
private static Map<String, Generator> createGenerators(
JdbcServices jdbcServices,
SqlStringGenerationContext sqlStringGenerationContext,
MetadataImplementor bootMetamodel,
BootstrapContext bootstrapContext) {
MetadataImplementor bootMetamodel) {
final Dialect dialect = jdbcServices.getJdbcEnvironment().getDialect();
final Map<String, Generator> generators = new HashMap<>();
bootMetamodel.getEntityBindings().stream()
.filter( model -> !model.isInherited() )
.forEach( model -> {
final Generator generator = model.getIdentifier().createGenerator(
bootstrapContext.getIdentifierGeneratorFactory(),
jdbcServices.getJdbcEnvironment().getDialect(),
(RootClass) model
);
if ( generator instanceof Configurable ) {
final Configurable identifierGenerator = (Configurable) generator;
identifierGenerator.initialize( sqlStringGenerationContext );
}
if ( generator.allowAssignedIdentifiers() ) {
( (SimpleValue) model.getIdentifier() ).setNullValue( "undefined" );
}
generators.put( model.getEntityName(), generator );
} );
for ( PersistentClass model : bootMetamodel.getEntityBindings() ) {
if ( !model.isInherited() ) {
final Generator generator = model.getIdentifier().createGenerator( dialect, (RootClass) model );
if (generator instanceof Configurable) {
final Configurable identifierGenerator = (Configurable) generator;
identifierGenerator.initialize( sqlStringGenerationContext );
}
if ( generator.allowAssignedIdentifiers() ) {
( (SimpleValue) model.getIdentifier() ).setNullValue( "undefined" );
}
generators.put( model.getEntityName(), generator );
}
}
return generators;
}
@ -775,10 +770,6 @@ public class SessionFactoryImpl extends QueryParameterBindingTypeResolverImpl im
return sqlStringGenerationContext;
}
public IdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return null;
}
@Override @Deprecated
public DeserializationResolver<?> getDeserializationResolver() {
return () -> (SessionFactoryImplementor)

View File

@ -36,7 +36,6 @@ import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.CompositeNestedGeneratedValueGenerator;
import org.hibernate.id.Configurable;
import org.hibernate.id.IdentifierGenerationException;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.internal.util.ReflectHelper;
import org.hibernate.internal.util.collections.ArrayHelper;
import org.hibernate.internal.util.collections.CollectionHelper;
@ -669,27 +668,17 @@ public class Component extends SimpleValue implements MetaAttributable, Sortable
}
@Override
public Generator createGenerator(
IdentifierGeneratorFactory identifierGeneratorFactory,
Dialect dialect,
RootClass rootClass) throws MappingException {
public Generator createGenerator(Dialect dialect, RootClass rootClass) throws MappingException {
if ( builtIdentifierGenerator == null ) {
builtIdentifierGenerator = buildIdentifierGenerator(
identifierGeneratorFactory,
dialect,
rootClass
);
builtIdentifierGenerator = buildIdentifierGenerator( dialect, rootClass );
}
return builtIdentifierGenerator;
}
private Generator buildIdentifierGenerator(
IdentifierGeneratorFactory identifierGeneratorFactory,
Dialect dialect,
RootClass rootClass) throws MappingException {
private Generator buildIdentifierGenerator( Dialect dialect, RootClass rootClass) throws MappingException {
final boolean hasCustomGenerator = ! DEFAULT_ID_GEN_STRATEGY.equals( getIdentifierGeneratorStrategy() );
if ( hasCustomGenerator ) {
return super.createGenerator( identifierGeneratorFactory, dialect, rootClass );
return super.createGenerator( dialect, rootClass );
}
final Class<?> entityClass = rootClass.getMappedClass();
@ -724,7 +713,7 @@ public class Component extends SimpleValue implements MetaAttributable, Sortable
// skip any 'assigned' generators, they would have been handled by
// the StandardGenerationContextLocator
generator.addGeneratedValuePlan( new ValueGenerationPlan(
value.createGenerator( identifierGeneratorFactory, dialect, rootClass ),
value.createGenerator( dialect, rootClass ),
getType().isMutable() ? injector( property, attributeDeclarer ) : null,
i
) );

View File

@ -29,13 +29,10 @@ public interface KeyValue extends Value {
boolean isUpdateable();
Generator createGenerator(
IdentifierGeneratorFactory identifierGeneratorFactory,
Dialect dialect,
RootClass rootClass);
Generator createGenerator(Dialect dialect, RootClass rootClass);
/**
* @deprecated Use {@link #createGenerator(IdentifierGeneratorFactory, Dialect, RootClass)} instead.
* @deprecated Use {@link #createGenerator(Dialect, RootClass)} instead.
* No longer used except in legacy tests.
*
* @return {@code null} if the {@code Generator} returned by {@link #createGenerator} is not an instance
@ -48,12 +45,12 @@ public interface KeyValue extends Value {
String defaultCatalog,
String defaultSchema,
RootClass rootClass) {
final Generator generator = createGenerator( identifierGeneratorFactory, dialect, rootClass );
final Generator generator = createGenerator( dialect, rootClass );
return generator instanceof IdentifierGenerator ? (IdentifierGenerator) generator : null;
}
/**
* @deprecated Use {@link #createGenerator(IdentifierGeneratorFactory, Dialect, RootClass)} instead.
* @deprecated Use {@link #createGenerator(Dialect, RootClass)} instead.
* No longer used except in legacy tests.
*
* @return {@code null} if the {@code Generator} returned by {@link #createGenerator} is not an instance
@ -64,7 +61,7 @@ public interface KeyValue extends Value {
IdentifierGeneratorFactory identifierGeneratorFactory,
Dialect dialect,
RootClass rootClass) {
final Generator generator = createGenerator( identifierGeneratorFactory, dialect, rootClass );
final Generator generator = createGenerator( dialect, rootClass );
return generator instanceof IdentifierGenerator ? (IdentifierGenerator) generator : null;
}
}

View File

@ -40,7 +40,6 @@ import org.hibernate.dialect.Dialect;
import org.hibernate.engine.spi.Mapping;
import org.hibernate.generator.Generator;
import org.hibernate.id.IdentityGenerator;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.id.factory.spi.CustomIdGeneratorCreationContext;
import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger;
@ -391,14 +390,11 @@ public abstract class SimpleValue implements KeyValue {
}
@Override
public Generator createGenerator(
IdentifierGeneratorFactory identifierGeneratorFactory,
Dialect dialect,
RootClass rootClass) throws MappingException {
public Generator createGenerator(Dialect dialect, RootClass rootClass) throws MappingException {
if ( generator == null ) {
if ( customIdGeneratorCreator != null ) {
generator = customIdGeneratorCreator.createGenerator(
new IdGeneratorCreationContext( identifierGeneratorFactory, null, null, rootClass )
new IdGeneratorCreationContext( null, null, rootClass )
);
}
else {
@ -1104,23 +1100,16 @@ public abstract class SimpleValue implements KeyValue {
}
private class IdGeneratorCreationContext implements CustomIdGeneratorCreationContext {
private final IdentifierGeneratorFactory identifierGeneratorFactory;
private final String defaultCatalog;
private final String defaultSchema;
private final RootClass rootClass;
public IdGeneratorCreationContext(IdentifierGeneratorFactory identifierGeneratorFactory, String defaultCatalog, String defaultSchema, RootClass rootClass) {
this.identifierGeneratorFactory = identifierGeneratorFactory;
public IdGeneratorCreationContext(String defaultCatalog, String defaultSchema, RootClass rootClass) {
this.defaultCatalog = defaultCatalog;
this.defaultSchema = defaultSchema;
this.rootClass = rootClass;
}
@Override
public IdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return identifierGeneratorFactory;
}
@Override
public Database getDatabase() {
return buildingContext.getMetadataCollector().getDatabase();

View File

@ -639,11 +639,7 @@ public abstract class AbstractCollectionPersister
}
private BeforeExecutionGenerator createGenerator(RuntimeModelCreationContext context, IdentifierCollection collection) {
final Generator generator = collection.getIdentifier().createGenerator(
context.getBootstrapContext().getIdentifierGeneratorFactory(),
context.getDialect(),
null
);
final Generator generator = collection.getIdentifier().createGenerator( context.getDialect(), null );
if ( generator.generatedOnExecution() ) {
throw new MappingException("must be an BeforeExecutionGenerator"); //TODO fix message
}

View File

@ -10,8 +10,9 @@ import org.hibernate.generator.EventType;
import org.hibernate.generator.Generator;
import org.hibernate.generator.OnExecutionGenerator;
import org.hibernate.id.Configurable;
import org.hibernate.id.IdentityGenerator;
import org.hibernate.id.PostInsertIdentityPersister;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.id.enhanced.SequenceStyleGenerator;
import org.hibernate.id.factory.spi.CustomIdGeneratorCreationContext;
import org.hibernate.id.insert.InsertGeneratedIdentifierDelegate;
import org.hibernate.service.ServiceRegistry;
@ -24,16 +25,20 @@ import java.util.Properties;
public class NativeGenerator
implements OnExecutionGenerator, BeforeExecutionGenerator, Configurable, ExportableProducer {
private final IdentifierGeneratorFactory factory;
private final String strategy;
private Generator generator;
private final Generator generator;
public NativeGenerator(NativeId nativeId, Member member, CustomIdGeneratorCreationContext creationContext) {
factory = creationContext.getIdentifierGeneratorFactory();
strategy = creationContext.getDatabase().getDialect().getNativeIdentifierGeneratorStrategy();
if ( "identity".equals(strategy) ) {
creationContext.getProperty().getValue().getColumns().get(0).setIdentity(true);
final String strategy = creationContext.getDatabase().getDialect().getNativeIdentifierGeneratorStrategy();
switch (strategy) {
case "sequence":
generator = new SequenceStyleGenerator();
break;
case "identity":
creationContext.getProperty().getValue().getColumns().get(0).setIdentity(true);
generator = new IdentityGenerator();
break;
default:
throw new IllegalArgumentException();
}
}
@ -49,22 +54,9 @@ public class NativeGenerator
@Override
public void configure(Type type, Properties parameters, ServiceRegistry serviceRegistry) {
generator = factory.createIdentifierGenerator(strategy, type, parameters);
//TODO: should use this instead of the deprecated method, but see HHH-18135
// GenerationType generationType;
// switch (strategy) {
// case "identity":
// generationType = GenerationType.IDENTITY;
// break;
// case "sequence":
// generationType = GenerationType.SEQUENCE;
// break;
// default:
// throw new AssertionFailure("unrecognized strategy");
// }
// generator =
// factory.createIdentifierGenerator( generationType, strategy, strategy, type.getJavaTypeDescriptor(),
// parameters, (a, b) -> null );
if ( generator instanceof Configurable ) {
((Configurable) generator).configure( type, parameters, serviceRegistry );
}
}
@Override