HHH-14497 - Drop legacy id-generator settings;

HHH-14718 - Drop deprecated generator implementations;
HHH-14959 - Drop IdentifierGeneratorFactory as a Service
This commit is contained in:
Steve Ebersole 2021-12-07 16:51:33 -06:00
parent 365aa58254
commit c394261508
28 changed files with 436 additions and 487 deletions

View File

@ -75,8 +75,6 @@
import org.hibernate.engine.spi.FilterDefinition;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.id.factory.spi.MutableIdentifierGeneratorFactory;
import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.util.collections.CollectionHelper;
@ -127,7 +125,6 @@ public class InFlightMetadataCollectorImpl implements InFlightMetadataCollector
private final AttributeConverterManager attributeConverterManager = new AttributeConverterManager();
private final UUID uuid;
private final MutableIdentifierGeneratorFactory identifierGeneratorFactory;
private final Map<String,PersistentClass> entityBindingMap = new HashMap<>();
private final List<Component> composites = new ArrayList<>();
@ -175,9 +172,6 @@ public InFlightMetadataCollectorImpl(
this.uuid = UUID.randomUUID();
this.options = options;
this.identifierGeneratorFactory = options.getServiceRegistry()
.getService( MutableIdentifierGeneratorFactory.class );
for ( Map.Entry<String, SqmFunctionDescriptor> sqlFunctionEntry : bootstrapContext.getSqlFunctions().entrySet() ) {
if ( sqlFunctionMap == null ) {
// we need this to be a ConcurrentHashMap for the one we ultimately pass along to the SF
@ -265,11 +259,6 @@ public void visitRegisteredComponents(Consumer<Component> consumer) {
composites.forEach( consumer );
}
@Override
public IdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return identifierGeneratorFactory;
}
@Override
public SessionFactoryBuilder getSessionFactoryBuilder() {
throw new UnsupportedOperationException(
@ -2228,7 +2217,6 @@ public MetadataImpl buildMetadataInstance(MetadataBuildingContext buildingContex
return new MetadataImpl(
uuid,
options,
identifierGeneratorFactory,
entityBindingMap,
composites,
mappedSuperClasses,
@ -2293,7 +2281,7 @@ private void handleIdentifierValueBinding(
// it could be done better
try {
final IdentifierGenerator ig = identifierValueBinding.createIdentifierGenerator(
getIdentifierGeneratorFactory(),
bootstrapContext.getIdentifierGeneratorFactory(),
dialect,
entityBinding
);

View File

@ -61,6 +61,8 @@
import org.hibernate.engine.config.spi.StandardConverters;
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory;
import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.log.DeprecationLogger;
@ -522,7 +524,9 @@ public static class MetadataBuildingOptionsImpl
implements MetadataBuildingOptions, JpaOrmXmlPersistenceUnitDefaultAware {
private final StandardServiceRegistry serviceRegistry;
private final MappingDefaultsImpl mappingDefaults;
private final IdentifierGeneratorFactory identifierGeneratorFactory;
private final TimeZoneStorageStrategy defaultTimezoneStorage;
// todo (6.0) : remove bootstrapContext property along with the deprecated methods
private BootstrapContext bootstrapContext;
@ -549,6 +553,7 @@ public static class MetadataBuildingOptionsImpl
public MetadataBuildingOptionsImpl(StandardServiceRegistry serviceRegistry) {
this.serviceRegistry = serviceRegistry;
this.identifierGeneratorFactory = new StandardIdentifierGeneratorFactory( serviceRegistry );
final StrategySelector strategySelector = serviceRegistry.getService( StrategySelector.class );
final ConfigurationService configService = serviceRegistry.getService( ConfigurationService.class );
@ -723,6 +728,11 @@ public MappingDefaults getMappingDefaults() {
return mappingDefaults;
}
@Override
public IdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return identifierGeneratorFactory;
}
@Override
public TimeZoneStorageStrategy getDefaultTimeZoneStorage() {
return defaultTimezoneStorage;

View File

@ -27,14 +27,14 @@
import org.hibernate.boot.model.relational.Database;
import org.hibernate.boot.model.relational.Namespace;
import org.hibernate.boot.model.relational.Sequence;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.spi.BootstrapContext;
import org.hibernate.boot.spi.MetadataBuildingOptions;
import org.hibernate.boot.spi.MetadataImplementor;
import org.hibernate.boot.query.NamedHqlQueryDefinition;
import org.hibernate.boot.query.NamedNativeQueryDefinition;
import org.hibernate.boot.query.NamedProcedureCallDefinition;
import org.hibernate.boot.query.NamedResultSetMappingDescriptor;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.spi.BootstrapContext;
import org.hibernate.boot.spi.MetadataBuildingOptions;
import org.hibernate.boot.spi.MetadataImplementor;
import org.hibernate.boot.spi.SessionFactoryBuilderFactory;
import org.hibernate.boot.spi.SessionFactoryBuilderImplementor;
import org.hibernate.boot.spi.SessionFactoryBuilderService;
@ -46,7 +46,6 @@
import org.hibernate.event.service.spi.EventListenerGroup;
import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.event.spi.EventType;
import org.hibernate.id.factory.spi.MutableIdentifierGeneratorFactory;
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.mapping.Collection;
import org.hibernate.mapping.Component;
@ -78,8 +77,6 @@ public class MetadataImpl implements MetadataImplementor, Serializable {
private final MetadataBuildingOptions metadataBuildingOptions;
private final BootstrapContext bootstrapContext;
private final MutableIdentifierGeneratorFactory identifierGeneratorFactory;
private final Map<String,PersistentClass> entityBindingMap;
private final List<Component> composites;
private final Map<Class, MappedSuperclass> mappedSuperclassMap;
@ -101,7 +98,6 @@ public class MetadataImpl implements MetadataImplementor, Serializable {
public MetadataImpl(
UUID uuid,
MetadataBuildingOptions metadataBuildingOptions,
MutableIdentifierGeneratorFactory identifierGeneratorFactory,
Map<String, PersistentClass> entityBindingMap,
List<Component> composites,
Map<Class, MappedSuperclass> mappedSuperclassMap,
@ -121,7 +117,6 @@ public MetadataImpl(
BootstrapContext bootstrapContext) {
this.uuid = uuid;
this.metadataBuildingOptions = metadataBuildingOptions;
this.identifierGeneratorFactory = identifierGeneratorFactory;
this.entityBindingMap = entityBindingMap;
this.composites = composites;
this.mappedSuperclassMap = mappedSuperclassMap;
@ -202,11 +197,6 @@ public Database getDatabase() {
return database;
}
@Override
public MutableIdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return identifierGeneratorFactory;
}
@Override
public java.util.Collection<PersistentClass> getEntityBindings() {
return entityBindingMap.values();

View File

@ -31,8 +31,10 @@ public class SqlStringGenerationContextImpl
* @param configurationMap The configuration map, holding settings such as {@link AvailableSettings#DEFAULT_SCHEMA}.
* @return An {@link SqlStringGenerationContext}.
*/
public static SqlStringGenerationContext fromConfigurationMap(JdbcEnvironment jdbcEnvironment,
Database database, Map<String, Object> configurationMap) {
public static SqlStringGenerationContext fromConfigurationMap(
JdbcEnvironment jdbcEnvironment,
Database database,
Map<String, Object> configurationMap) {
String defaultCatalog = (String) configurationMap.get( AvailableSettings.DEFAULT_CATALOG );
String defaultSchema = (String) configurationMap.get( AvailableSettings.DEFAULT_SCHEMA );
return fromExplicit( jdbcEnvironment, database, defaultCatalog, defaultSchema );
@ -45,11 +47,15 @@ public static SqlStringGenerationContext fromConfigurationMap(JdbcEnvironment jd
* @param defaultSchema The default schema to use; if {@code null}, will use the implicit schema that was configured through XML mapping.
* @return An {@link SqlStringGenerationContext}.
*/
public static SqlStringGenerationContext fromExplicit(JdbcEnvironment jdbcEnvironment,
Database database, String defaultCatalog, String defaultSchema) {
Namespace.Name implicitNamespaceName = database.getPhysicalImplicitNamespaceName();
IdentifierHelper identifierHelper = jdbcEnvironment.getIdentifierHelper();
NameQualifierSupport nameQualifierSupport = jdbcEnvironment.getNameQualifierSupport();
public static SqlStringGenerationContext fromExplicit(
JdbcEnvironment jdbcEnvironment,
Database database,
String defaultCatalog,
String defaultSchema) {
final Namespace.Name implicitNamespaceName = database.getPhysicalImplicitNamespaceName();
final IdentifierHelper identifierHelper = jdbcEnvironment.getIdentifierHelper();
final NameQualifierSupport nameQualifierSupport = jdbcEnvironment.getNameQualifierSupport();
Identifier actualDefaultCatalog = null;
if ( nameQualifierSupport.supportsCatalogs() ) {
actualDefaultCatalog = identifierHelper.toIdentifier( defaultCatalog );
@ -57,6 +63,7 @@ public static SqlStringGenerationContext fromExplicit(JdbcEnvironment jdbcEnviro
actualDefaultCatalog = implicitNamespaceName.getCatalog();
}
}
Identifier actualDefaultSchema = null;
if ( nameQualifierSupport.supportsSchemas() ) {
actualDefaultSchema = identifierHelper.toIdentifier( defaultSchema );
@ -64,6 +71,7 @@ public static SqlStringGenerationContext fromExplicit(JdbcEnvironment jdbcEnviro
actualDefaultSchema = implicitNamespaceName.getSchema();
}
}
return new SqlStringGenerationContextImpl( jdbcEnvironment, actualDefaultCatalog, actualDefaultSchema );
}
@ -85,8 +93,10 @@ public static SqlStringGenerationContext forTests(JdbcEnvironment jdbcEnvironmen
private final Identifier defaultSchema;
@SuppressWarnings("deprecation")
private SqlStringGenerationContextImpl(JdbcEnvironment jdbcEnvironment,
Identifier defaultCatalog, Identifier defaultSchema) {
private SqlStringGenerationContextImpl(
JdbcEnvironment jdbcEnvironment,
Identifier defaultCatalog,
Identifier defaultSchema) {
this.dialect = jdbcEnvironment.getDialect();
this.identifierHelper = jdbcEnvironment.getIdentifierHelper();
this.qualifiedObjectNameFormatter = jdbcEnvironment.getQualifiedObjectNameFormatter();

View File

@ -25,7 +25,6 @@
import org.hibernate.cfg.annotations.NamedEntityGraphDefinition;
import org.hibernate.engine.spi.FilterDefinition;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.mapping.Component;
import org.hibernate.mapping.FetchProfile;
import org.hibernate.mapping.MappedSuperclass;
@ -54,11 +53,6 @@ protected MetadataImplementor delegate() {
return delegate;
}
@Override
public IdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return delegate.getIdentifierGeneratorFactory();
}
@Override
public Type getIdentifierType(String className) throws MappingException {
return delegate.getIdentifierType( className );

View File

@ -21,6 +21,7 @@
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.cache.spi.access.AccessType;
import org.hibernate.cfg.MetadataSourceType;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.type.spi.TypeConfiguration;
import org.jboss.jandex.IndexView;
@ -53,6 +54,11 @@ public MappingDefaults getMappingDefaults() {
return delegate.getMappingDefaults();
}
@Override
public IdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return delegate.getIdentifierGeneratorFactory();
}
@Override
public TimeZoneStorageStrategy getDefaultTimeZoneStorage() {
return delegate.getDefaultTimeZoneStorage();

View File

@ -9,9 +9,6 @@
import java.util.Collection;
import java.util.Map;
import jakarta.xml.bind.JAXBContext;
import javax.xml.stream.XMLInputFactory;
import org.hibernate.Incubating;
import org.hibernate.annotations.common.reflection.ReflectionManager;
import org.hibernate.boot.CacheRegionDefinition;
@ -22,6 +19,7 @@
import org.hibernate.boot.model.convert.spi.ConverterDescriptor;
import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.jpa.spi.MutableJpaCompliance;
import org.hibernate.metamodel.spi.ManagedTypeRepresentationResolver;
import org.hibernate.query.sqm.function.SqmFunctionDescriptor;
@ -50,6 +48,10 @@ public interface BootstrapContext {
MetadataBuildingOptions getMetadataBuildingOptions();
default IdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return getMetadataBuildingOptions().getIdentifierGeneratorFactory();
}
boolean isJpaBootstrap();
/**

View File

@ -7,7 +7,9 @@
package org.hibernate.boot.spi;
import java.util.List;
import jakarta.persistence.SharedCacheMode;
import org.hibernate.TimeZoneStorageStrategy;
import org.hibernate.annotations.common.reflection.ReflectionManager;
import org.hibernate.boot.CacheRegionDefinition;
@ -22,11 +24,14 @@
import org.hibernate.cfg.MetadataSourceType;
import org.hibernate.collection.internal.StandardCollectionSemanticsResolver;
import org.hibernate.collection.spi.CollectionSemanticsResolver;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.metamodel.internal.ManagedTypeRepresentationResolverStandard;
import org.hibernate.metamodel.spi.ManagedTypeRepresentationResolver;
import org.hibernate.type.spi.TypeConfiguration;
import org.jboss.jandex.IndexView;
import jakarta.persistence.SharedCacheMode;
/**
* Describes the options used while building the Metadata object (during
* {@link org.hibernate.boot.MetadataBuilder#build()} processing).
@ -50,6 +55,8 @@ public interface MetadataBuildingOptions {
*/
MappingDefaults getMappingDefaults();
IdentifierGeneratorFactory getIdentifierGeneratorFactory();
TimeZoneStorageStrategy getDefaultTimeZoneStorage();
default ManagedTypeRepresentationResolver getManagedTypeRepresentationResolver() {
@ -246,7 +253,7 @@ default CollectionSemanticsResolver getPersistentCollectionRepresentationResolve
* Should we create constraint by default?
*
* @see jakarta.persistence.ConstraintMode#PROVIDER_DEFAULT
* @see org.hibernate.cfg.AvailableSettings#DEFAULT_CONSTRAINT_MODE
* @see org.hibernate.cfg.AvailableSettings#HBM2DDL_DEFAULT_CONSTRAINT_MODE
*
* @return {@code true} if not create constraint by default; {@code false} otherwise.
*/

View File

@ -7,7 +7,6 @@
package org.hibernate.engine.spi;
import org.hibernate.MappingException;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.type.Type;
/**
@ -19,19 +18,14 @@
* @see org.hibernate.internal.SessionFactoryImpl
* @see org.hibernate.cfg.Configuration
* @author Gavin King
*
* @deprecated (since 6.0) Use {@link org.hibernate.type.spi.TypeConfiguration},
* {@link org.hibernate.boot.Metadata} or {@link org.hibernate.metamodel.RuntimeMetamodels}
* to access such information
*/
@Deprecated
public interface Mapping {
/**
* Allow access to the id generator factory, though this is only needed/allowed from configuration.
*
* @return Access to the identifier generator factory
*
* @deprecated temporary solution
*/
@Deprecated
public IdentifierGeneratorFactory getIdentifierGeneratorFactory();
public Type getIdentifierType(String className) throws MappingException;
public String getIdentifierPropertyName(String className) throws MappingException;
public Type getReferencedPropertyType(String className, String propertyName) throws MappingException;
Type getIdentifierType(String className) throws MappingException;
String getIdentifierPropertyName(String className) throws MappingException;
Type getReferencedPropertyType(String className, String propertyName) throws MappingException;
}

View File

@ -12,11 +12,6 @@
import java.util.Set;
import javax.naming.NamingException;
import javax.naming.Reference;
import jakarta.persistence.EntityGraph;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceUnitUtil;
import jakarta.persistence.Query;
import jakarta.persistence.SynchronizationType;
import org.hibernate.CustomEntityDirtinessStrategy;
import org.hibernate.EntityNameResolver;
@ -40,7 +35,6 @@
import org.hibernate.exception.spi.SQLExceptionConverter;
import org.hibernate.graph.spi.RootGraphImplementor;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.internal.FastSessionServices;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.metadata.CollectionMetadata;
@ -59,6 +53,12 @@
import org.hibernate.type.descriptor.WrapperOptions;
import org.hibernate.type.spi.TypeConfiguration;
import jakarta.persistence.EntityGraph;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceUnitUtil;
import jakarta.persistence.Query;
import jakarta.persistence.SynchronizationType;
/**
* Base delegating implementation of the SessionFactory and SessionFactoryImplementor
* contracts for intended for easier implementation of SessionFactory.
@ -362,11 +362,6 @@ public DeserializationResolver getDeserializationResolver() {
return delegate.getDeserializationResolver();
}
@Override
public IdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return delegate.getIdentifierGeneratorFactory();
}
@Override
public Type getIdentifierType(String className) throws MappingException {
return delegate.getIdentifierType( className );

View File

@ -0,0 +1,19 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
package org.hibernate.id.factory;
import org.jboss.logging.Logger;
/**
* Logging related to IdentifierGeneratorFactory
*/
public class IdGenCreationLogging {
public static final Logger ID_GEN_LOGGER = Logger.getLogger( "org.hibernate.orm.idgen.factory" );
public static final boolean IS_TRACE_ENABLE = ID_GEN_LOGGER.isTraceEnabled();
public static final boolean IS_DEBUG_ENABLE = ID_GEN_LOGGER.isDebugEnabled();
}

View File

@ -5,9 +5,9 @@
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.id.factory;
import java.util.Properties;
import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.dialect.Dialect;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.type.Type;
@ -25,17 +25,6 @@ public interface IdentifierGeneratorFactory {
*/
Dialect getDialect();
/**
* Allow injection of the dialect to use.
*
* @param dialect The dialect
*
* @deprecated The intention is that Dialect should be required to be specified up-front and it would then get
* ctor injected.
*/
@Deprecated
void setDialect(Dialect dialect);
/**
* Given a strategy, retrieve the appropriate identifier generator instance.
*

View File

@ -1,177 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.id.factory.internal;
import java.io.Serializable;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import org.hibernate.MappingException;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.config.spi.ConfigurationService;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.hibernate.id.Assigned;
import org.hibernate.id.ForeignGenerator;
import org.hibernate.id.GUIDGenerator;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.IdentityGenerator;
import org.hibernate.id.IncrementGenerator;
import org.hibernate.id.SelectGenerator;
import org.hibernate.id.UUIDGenerator;
import org.hibernate.id.UUIDHexGenerator;
import org.hibernate.id.enhanced.SequenceStyleGenerator;
import org.hibernate.id.enhanced.TableGenerator;
import org.hibernate.id.factory.spi.MutableIdentifierGeneratorFactory;
import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.resource.beans.container.spi.BeanContainer;
import org.hibernate.resource.beans.container.spi.ContainedBean;
import org.hibernate.resource.beans.internal.FallbackBeanInstanceProducer;
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.spi.ServiceRegistryAwareService;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.type.Type;
/**
* Basic <tt>templated</tt> support for {@link org.hibernate.id.factory.IdentifierGeneratorFactory} implementations.
*
* @author Steve Ebersole
*/
@SuppressWarnings( { "deprecation" ,"rawtypes" ,"serial" } )
public class DefaultIdentifierGeneratorFactory
implements MutableIdentifierGeneratorFactory, Serializable, ServiceRegistryAwareService, BeanContainer.LifecycleOptions {
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultIdentifierGeneratorFactory.class );
private final boolean ignoreBeanContainer;
private ServiceRegistry serviceRegistry;
private Dialect dialect;
private final ConcurrentHashMap<String, Class> generatorStrategyToClassNameMap = new ConcurrentHashMap<>();
private BeanContainer beanContainer;
/**
* Constructs a new DefaultIdentifierGeneratorFactory.
*/
public DefaultIdentifierGeneratorFactory() {
this( false );
}
/**
* Allows to explicitly control if the BeanContainer should be ignored
* (if there is one registered) when initializing any new IdentifierGenerator
* instances.
* @param ignoreBeanContainer
*/
public DefaultIdentifierGeneratorFactory(boolean ignoreBeanContainer) {
this.ignoreBeanContainer = ignoreBeanContainer;
register( "uuid", UUIDHexGenerator.class );
register( "uuid2", UUIDGenerator.class );
register( "uuid.hex", UUIDHexGenerator.class );
// could be done with UUIDGenerator + strategy
register( "guid", GUIDGenerator.class );
register( "assigned", Assigned.class );
register( "identity", IdentityGenerator.class );
register( "select", SelectGenerator.class );
register( "sequence", SequenceStyleGenerator.class );
register( "increment", IncrementGenerator.class );
register( "foreign", ForeignGenerator.class );
register( "enhanced-sequence", SequenceStyleGenerator.class );
register( "enhanced-table", TableGenerator.class );
}
public void register(String strategy, Class generatorClass) {
LOG.debugf( "Registering IdentifierGenerator strategy [%s] -> [%s]", strategy, generatorClass.getName() );
final Class previous = generatorStrategyToClassNameMap.put( strategy, generatorClass );
if ( previous != null && LOG.isDebugEnabled() ) {
LOG.debugf( " - overriding [%s]", previous.getName() );
}
}
@Override
public Dialect getDialect() {
return dialect;
}
@Override
public void setDialect(Dialect dialect) {
}
@SuppressWarnings("unchecked")
@Override
public IdentifierGenerator createIdentifierGenerator(String strategy, Type type, Properties config) {
try {
Class clazz = getIdentifierGeneratorClass( strategy );
IdentifierGenerator identifierGenerator;
if ( beanContainer == null || generatorStrategyToClassNameMap.containsKey( strategy ) ) {
identifierGenerator = ( IdentifierGenerator ) clazz.newInstance();
}
else {
final ContainedBean<IdentifierGenerator> generatorBean = beanContainer.getBean(
clazz,
this,
FallbackBeanInstanceProducer.INSTANCE
);
identifierGenerator = generatorBean.getBeanInstance();
}
identifierGenerator.configure( type, config, serviceRegistry );
return identifierGenerator;
}
catch ( Exception e ) {
final String entityName = config.getProperty( IdentifierGenerator.ENTITY_NAME );
throw new MappingException( String.format( "Could not instantiate id generator [entity-name=%s]", entityName ), e );
}
}
@Override
public boolean canUseCachedReferences() {
return false;
}
@Override
public boolean useJpaCompliantCreation() {
return true;
}
@Override
public Class getIdentifierGeneratorClass(String strategy) {
if ( "hilo".equals( strategy ) ) {
throw new UnsupportedOperationException( "Support for 'hilo' generator has been removed" );
}
String resolvedStrategy = "native".equals( strategy ) ?
getDialect().getNativeIdentifierGeneratorStrategy() : strategy;
Class generatorClass = generatorStrategyToClassNameMap.get( resolvedStrategy );
try {
if ( generatorClass == null ) {
final ClassLoaderService cls = serviceRegistry.getService( ClassLoaderService.class );
generatorClass = cls.classForName( resolvedStrategy );
}
}
catch ( ClassLoadingException e ) {
throw new MappingException( String.format( "Could not interpret id generator strategy [%s]", strategy ) );
}
return generatorClass;
}
@Override
public void injectServices(ServiceRegistryImplementor serviceRegistry) {
this.serviceRegistry = serviceRegistry;
this.dialect = serviceRegistry.getService( JdbcEnvironment.class ).getDialect();
final ConfigurationService configService = serviceRegistry.getService( ConfigurationService.class );
if ( ! this.ignoreBeanContainer ) {
this.beanContainer = serviceRegistry.getService( ManagedBeanRegistry.class ).getBeanContainer();
//else we just have beanContainer = null;
}
}
}

View File

@ -1,30 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.id.factory.internal;
import java.util.Map;
import org.hibernate.boot.registry.StandardServiceInitiator;
import org.hibernate.id.factory.spi.MutableIdentifierGeneratorFactory;
import org.hibernate.service.spi.ServiceRegistryImplementor;
/**
* @author <a href="mailto:emmanuel@hibernate.org">Emmanuel Bernard</a>
*/
public class MutableIdentifierGeneratorFactoryInitiator implements StandardServiceInitiator<MutableIdentifierGeneratorFactory> {
public static final MutableIdentifierGeneratorFactoryInitiator INSTANCE = new MutableIdentifierGeneratorFactoryInitiator();
@Override
public Class<MutableIdentifierGeneratorFactory> getServiceInitiated() {
return MutableIdentifierGeneratorFactory.class;
}
@Override
public MutableIdentifierGeneratorFactory initiateService(Map configurationValues, ServiceRegistryImplementor registry) {
return new DefaultIdentifierGeneratorFactory();
}
}

View File

@ -0,0 +1,203 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.id.factory.internal;
import java.io.Serializable;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import org.hibernate.MappingException;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
import org.hibernate.boot.registry.selector.spi.StrategySelector;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.config.spi.ConfigurationService;
import org.hibernate.engine.config.spi.StandardConverters;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.hibernate.id.Assigned;
import org.hibernate.id.ForeignGenerator;
import org.hibernate.id.GUIDGenerator;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.IdentityGenerator;
import org.hibernate.id.IncrementGenerator;
import org.hibernate.id.SelectGenerator;
import org.hibernate.id.UUIDGenerator;
import org.hibernate.id.UUIDHexGenerator;
import org.hibernate.id.enhanced.SequenceStyleGenerator;
import org.hibernate.id.enhanced.TableGenerator;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.jpa.spi.IdentifierGeneratorStrategyProvider;
import org.hibernate.resource.beans.container.spi.BeanContainer;
import org.hibernate.resource.beans.container.spi.ContainedBean;
import org.hibernate.resource.beans.container.spi.ExtendedBeanManager;
import org.hibernate.resource.beans.internal.FallbackBeanInstanceProducer;
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.type.Type;
import static org.hibernate.id.factory.IdGenCreationLogging.ID_GEN_LOGGER;
/**
* Basic <tt>templated</tt> support for {@link org.hibernate.id.factory.IdentifierGeneratorFactory} implementations.
*
* @author Steve Ebersole
*/
@SuppressWarnings( { "deprecation" ,"rawtypes" } )
public class StandardIdentifierGeneratorFactory
implements IdentifierGeneratorFactory, BeanContainer.LifecycleOptions, Serializable {
private final ConcurrentHashMap<String, Class<? extends IdentifierGenerator>> legacyGeneratorClassNameMap = new ConcurrentHashMap<>();
private final ServiceRegistry serviceRegistry;
private final BeanContainer beanContainer;
private Dialect dialect;
/**
* Constructs a new factory
*/
public StandardIdentifierGeneratorFactory(ServiceRegistry serviceRegistry) {
this( serviceRegistry, shouldIgnoreBeanContainer( serviceRegistry ) );
}
private static boolean shouldIgnoreBeanContainer(ServiceRegistry serviceRegistry) {
final ConfigurationService configService = serviceRegistry.getService( ConfigurationService.class );
final Object beanManagerRef = configService.getSettings().get( AvailableSettings.JAKARTA_CDI_BEAN_MANAGER );
if ( beanManagerRef instanceof ExtendedBeanManager ) {
return true;
}
if ( configService.getSetting( AvailableSettings.DELAY_CDI_ACCESS, StandardConverters.BOOLEAN, false ) ) {
return true;
}
return false;
}
/**
* Constructs a new factory, explicitly controlling whether to use
* CDI or not
*/
public StandardIdentifierGeneratorFactory(ServiceRegistry serviceRegistry, boolean ignoreBeanContainer) {
this.serviceRegistry = serviceRegistry;
if ( ignoreBeanContainer ) {
ID_GEN_LOGGER.debug( "Ignoring CDI for resolving IdentifierGenerator instances as extended or delayed CDI support was enabled" );
this.beanContainer = null;
}
else {
this.beanContainer = serviceRegistry.getService( ManagedBeanRegistry.class ).getBeanContainer();
if ( beanContainer == null ) {
ID_GEN_LOGGER.debug( "Resolving IdentifierGenerator instances will not use CDI as it was not configured" );
}
}
register( "uuid2", UUIDGenerator.class );
register( "guid", GUIDGenerator.class ); // can be done with UUIDGenerator + strategy
register( "uuid", UUIDHexGenerator.class ); // "deprecated" for new use
register( "uuid.hex", UUIDHexGenerator.class ); // uuid.hex is deprecated
register( "assigned", Assigned.class );
register( "identity", IdentityGenerator.class );
register( "select", SelectGenerator.class );
register( "sequence", SequenceStyleGenerator.class );
register( "increment", IncrementGenerator.class );
register( "foreign", ForeignGenerator.class );
register( "enhanced-sequence", SequenceStyleGenerator.class );
register( "enhanced-table", TableGenerator.class );
final ConfigurationService configService = serviceRegistry.getService( ConfigurationService.class );
final Object providerSetting = configService.getSettings().get( AvailableSettings.IDENTIFIER_GENERATOR_STRATEGY_PROVIDER );
if ( providerSetting != null ) {
final IdentifierGeneratorStrategyProvider idGeneratorStrategyProvider = serviceRegistry.getService( StrategySelector.class ).resolveStrategy(
IdentifierGeneratorStrategyProvider.class,
providerSetting
);
for ( Map.Entry<String,Class<?>> entry : idGeneratorStrategyProvider.getStrategies().entrySet() ) {
register( entry.getKey(), (Class) entry.getValue() );
}
}
}
private void register(String strategy, Class<? extends IdentifierGenerator> generatorClass) {
ID_GEN_LOGGER.debugf( "Registering IdentifierGenerator strategy [%s] -> [%s]", strategy, generatorClass.getName() );
final Class previous = legacyGeneratorClassNameMap.put( strategy, generatorClass );
if ( previous != null && ID_GEN_LOGGER.isDebugEnabled() ) {
ID_GEN_LOGGER.debugf( " - overriding [%s]", previous.getName() );
}
}
@Override
public Dialect getDialect() {
if ( dialect == null ) {
dialect = serviceRegistry.getService( JdbcEnvironment.class ).getDialect();
}
return dialect;
}
@Override
public IdentifierGenerator createIdentifierGenerator(String strategy, Type type, Properties config) {
try {
final Class<? extends IdentifierGenerator> clazz = getIdentifierGeneratorClass( strategy );
final IdentifierGenerator identifierGenerator;
if ( beanContainer == null || legacyGeneratorClassNameMap.containsKey( strategy ) ) {
identifierGenerator = clazz.newInstance();
}
else {
final ContainedBean<? extends IdentifierGenerator> generatorBean = beanContainer.getBean(
clazz,
this,
FallbackBeanInstanceProducer.INSTANCE
);
identifierGenerator = generatorBean.getBeanInstance();
}
identifierGenerator.configure( type, config, serviceRegistry );
return identifierGenerator;
}
catch ( Exception e ) {
final String entityName = config.getProperty( IdentifierGenerator.ENTITY_NAME );
throw new MappingException( String.format( "Could not instantiate id generator [entity-name=%s]", entityName ), e );
}
}
@Override
public boolean canUseCachedReferences() {
return false;
}
@Override
public boolean useJpaCompliantCreation() {
return true;
}
@Override
public Class<? extends IdentifierGenerator> getIdentifierGeneratorClass(String strategy) {
if ( "hilo".equals( strategy ) ) {
throw new UnsupportedOperationException( "Support for 'hilo' generator has been removed" );
}
String resolvedStrategy = "native".equals( strategy )
? getDialect().getNativeIdentifierGeneratorStrategy()
: strategy;
Class generatorClass = legacyGeneratorClassNameMap.get( resolvedStrategy );
try {
if ( generatorClass == null ) {
final ClassLoaderService cls = serviceRegistry.getService( ClassLoaderService.class );
generatorClass = cls.classForName( resolvedStrategy );
}
}
catch ( ClassLoadingException e ) {
throw new MappingException( String.format( "Could not interpret id generator strategy [%s]", strategy ) );
}
return generatorClass;
}
}

View File

@ -1,19 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.id.factory.spi;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.service.Service;
/**
* Let people register strategies
*
* @author <a href="mailto:emmanuel@hibernate.org">Emmanuel Bernard</a>
*/
public interface MutableIdentifierGeneratorFactory extends IdentifierGeneratorFactory, Service {
public void register(String strategy, Class generatorClass);
}

View File

@ -297,8 +297,8 @@ public void sessionFactoryClosed(SessionFactory factory) {
//Generators:
this.identifierGenerators = new HashMap<>();
bootMetamodel.getEntityBindings().stream().filter( model -> !model.isInherited() ).forEach( model -> {
IdentifierGenerator generator = model.getIdentifier().createIdentifierGenerator(
bootMetamodel.getIdentifierGeneratorFactory(),
final IdentifierGenerator generator = model.getIdentifier().createIdentifierGenerator(
bootstrapContext.getIdentifierGeneratorFactory(),
jdbcServices.getJdbcEnvironment().getDialect(),
(RootClass) model
);

View File

@ -55,7 +55,6 @@
import org.hibernate.cfg.beanvalidation.BeanValidationIntegrator;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.id.factory.spi.MutableIdentifierGeneratorFactory;
import org.hibernate.integrator.spi.Integrator;
import org.hibernate.internal.EntityManagerMessageLogger;
import org.hibernate.internal.util.NullnessHelper;
@ -68,7 +67,6 @@
import org.hibernate.jpa.boot.spi.TypeContributorList;
import org.hibernate.jpa.internal.util.LogHelper;
import org.hibernate.jpa.internal.util.PersistenceUnitTransactionTypeHelper;
import org.hibernate.jpa.spi.IdentifierGeneratorStrategyProvider;
import org.hibernate.proxy.EntityNotFoundDelegate;
import org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorBuilderImpl;
import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorBuilderImpl;
@ -261,11 +259,8 @@ private EntityManagerFactoryBuilderImpl(
this.standardServiceRegistry = ssrBuilder.build();
configureIdentifierGenerators( standardServiceRegistry );
final MetadataSources metadataSources = new MetadataSources( bsr );
this.metamodelBuilder = (MetadataBuilderImplementor) metadataSources.getMetadataBuilder(
standardServiceRegistry );
this.metamodelBuilder = (MetadataBuilderImplementor) metadataSources.getMetadataBuilder( standardServiceRegistry );
List<ConverterDescriptor> attributeConverterDefinitions = applyMappingResources( metadataSources );
applyMetamodelBuilderSettings( mergedSettings, attributeConverterDefinitions );
@ -1213,29 +1208,6 @@ private CacheRegionDefinition parseCacheRegionDefinitionEntry(String role, Strin
return new CacheRegionDefinition( cacheType, role, usage, region, lazyProperty );
}
private void configureIdentifierGenerators(StandardServiceRegistry ssr) {
final StrategySelector strategySelector = ssr.getService( StrategySelector.class );
// apply id generators
final Object idGeneratorStrategyProviderSetting = configurationValues.remove( AvailableSettings.IDENTIFIER_GENERATOR_STRATEGY_PROVIDER );
if ( idGeneratorStrategyProviderSetting != null ) {
final IdentifierGeneratorStrategyProvider idGeneratorStrategyProvider = strategySelector.resolveStrategy(
IdentifierGeneratorStrategyProvider.class,
idGeneratorStrategyProviderSetting
);
final MutableIdentifierGeneratorFactory identifierGeneratorFactory = ssr.getService( MutableIdentifierGeneratorFactory.class );
if ( identifierGeneratorFactory == null ) {
throw persistenceException(
"Application requested custom identifier generator strategies, " +
"but the MutableIdentifierGeneratorFactory could not be found"
);
}
for ( Map.Entry<String,Class<?>> entry : idGeneratorStrategyProvider.getStrategies().entrySet() ) {
identifierGeneratorFactory.register( entry.getKey(), entry.getValue() );
}
}
}
@SuppressWarnings("unchecked")
private List<ConverterDescriptor> applyMappingResources(MetadataSources metadataSources) {
// todo : where in the heck are `org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor.getManagedClassNames` handled?!?

View File

@ -389,7 +389,6 @@ public IdentifierGenerator createIdentifierGenerator(
);
}
identifierGeneratorFactory.setDialect( dialect );
identifierGenerator = identifierGeneratorFactory.createIdentifierGenerator(
identifierGeneratorStrategy,
getType(),
@ -429,7 +428,6 @@ public String getIdentifierGeneratorStrategy() {
}
public boolean isIdentityColumn(IdentifierGeneratorFactory identifierGeneratorFactory, Dialect dialect) {
identifierGeneratorFactory.setDialect( dialect );
return IdentityGenerator.class.isAssignableFrom(identifierGeneratorFactory.getIdentifierGeneratorClass( identifierGeneratorStrategy ));
}

View File

@ -486,100 +486,104 @@ public boolean hasPrimaryKey() {
}
@Override
public String sqlCreateString(Mapping p, SqlStringGenerationContext context, String defaultCatalog,
public String sqlCreateString(
Mapping p,
SqlStringGenerationContext context,
String defaultCatalog,
String defaultSchema) {
Dialect dialect = context.getDialect();
StringBuilder buf = new StringBuilder( hasPrimaryKey() ? dialect.getCreateTableString() : dialect.getCreateMultisetTableString() )
.append( ' ' )
.append( getQualifiedName( context ) )
.append( " (" );
boolean identityColumn = idValue != null && idValue.isIdentityColumn( p.getIdentifierGeneratorFactory(), dialect );
// Try to find out the name of the primary key to create it as identity if the IdentityGenerator is used
String pkname = null;
if ( hasPrimaryKey() && identityColumn ) {
pkname = getPrimaryKey().getColumnIterator().next().getQuotedName( dialect );
}
Iterator<Column> iter = getColumnIterator();
while ( iter.hasNext() ) {
Column col = (Column) iter.next();
buf.append( col.getQuotedName( dialect ) )
.append( ' ' );
if ( identityColumn && col.getQuotedName( dialect ).equals( pkname ) ) {
// to support dialects that have their own identity data type
if ( dialect.getIdentityColumnSupport().hasDataTypeInIdentityColumn() ) {
buf.append( col.getSqlType( dialect, p ) );
}
buf.append( ' ' )
.append( dialect.getIdentityColumnSupport().getIdentityColumnString( col.getSqlTypeCode( p ) ) );
}
else {
final String columnType = col.getSqlType( dialect, p );
buf.append( columnType );
String defaultValue = col.getDefaultValue();
if ( defaultValue != null ) {
buf.append( " default " ).append( defaultValue );
}
if ( col.isNullable() ) {
buf.append( dialect.getNullColumnString( columnType ) );
}
else {
buf.append( " not null" );
}
}
if ( col.isUnique() ) {
String keyName = Constraint.generateName( "UK_", this, col );
UniqueKey uk = getOrCreateUniqueKey( keyName );
uk.addColumn( col );
buf.append( dialect.getUniqueDelegate()
.getColumnDefinitionUniquenessFragment( col, context ) );
}
String checkConstraint = col.checkConstraint();
if ( checkConstraint!=null && dialect.supportsColumnCheck() ) {
buf.append( checkConstraint );
}
String columnComment = col.getComment();
if ( columnComment != null ) {
buf.append( dialect.getColumnComment( columnComment ) );
}
if ( iter.hasNext() ) {
buf.append( ", " );
}
}
if ( hasPrimaryKey() ) {
buf.append( ", " )
.append( getPrimaryKey().sqlConstraintString( dialect ) );
}
buf.append( dialect.getUniqueDelegate().getTableCreationUniqueConstraintsFragment( this, context ) );
if ( dialect.supportsTableCheck() ) {
for ( String checkConstraint : checkConstraints ) {
buf.append( ", check (" )
.append( checkConstraint )
.append( ')' );
}
}
buf.append( ')' );
if ( comment != null ) {
buf.append( dialect.getTableComment( comment ) );
}
return buf.append( dialect.getTableTypeString() ).toString();
throw new UnsupportedOperationException();
// Dialect dialect = context.getDialect();
// StringBuilder buf = new StringBuilder( hasPrimaryKey() ? dialect.getCreateTableString() : dialect.getCreateMultisetTableString() )
// .append( ' ' )
// .append( getQualifiedName( context ) )
// .append( " (" );
//
// boolean identityColumn = idValue != null && idValue.isIdentityColumn( p.getIdentifierGeneratorFactory(), dialect );
//
// // Try to find out the name of the primary key to create it as identity if the IdentityGenerator is used
// String pkname = null;
// if ( hasPrimaryKey() && identityColumn ) {
// pkname = getPrimaryKey().getColumnIterator().next().getQuotedName( dialect );
// }
//
// Iterator<Column> iter = getColumnIterator();
// while ( iter.hasNext() ) {
// Column col = (Column) iter.next();
//
// buf.append( col.getQuotedName( dialect ) )
// .append( ' ' );
//
// if ( identityColumn && col.getQuotedName( dialect ).equals( pkname ) ) {
// // to support dialects that have their own identity data type
// if ( dialect.getIdentityColumnSupport().hasDataTypeInIdentityColumn() ) {
// buf.append( col.getSqlType( dialect, p ) );
// }
// buf.append( ' ' )
// .append( dialect.getIdentityColumnSupport().getIdentityColumnString( col.getSqlTypeCode( p ) ) );
// }
// else {
// final String columnType = col.getSqlType( dialect, p );
// buf.append( columnType );
//
// String defaultValue = col.getDefaultValue();
// if ( defaultValue != null ) {
// buf.append( " default " ).append( defaultValue );
// }
//
// if ( col.isNullable() ) {
// buf.append( dialect.getNullColumnString( columnType ) );
// }
// else {
// buf.append( " not null" );
// }
//
// }
//
// if ( col.isUnique() ) {
// String keyName = Constraint.generateName( "UK_", this, col );
// UniqueKey uk = getOrCreateUniqueKey( keyName );
// uk.addColumn( col );
// buf.append( dialect.getUniqueDelegate()
// .getColumnDefinitionUniquenessFragment( col, context ) );
// }
//
// String checkConstraint = col.checkConstraint();
// if ( checkConstraint!=null && dialect.supportsColumnCheck() ) {
// buf.append( checkConstraint );
// }
//
// String columnComment = col.getComment();
// if ( columnComment != null ) {
// buf.append( dialect.getColumnComment( columnComment ) );
// }
//
// if ( iter.hasNext() ) {
// buf.append( ", " );
// }
//
// }
// if ( hasPrimaryKey() ) {
// buf.append( ", " )
// .append( getPrimaryKey().sqlConstraintString( dialect ) );
// }
//
// buf.append( dialect.getUniqueDelegate().getTableCreationUniqueConstraintsFragment( this, context ) );
//
// if ( dialect.supportsTableCheck() ) {
// for ( String checkConstraint : checkConstraints ) {
// buf.append( ", check (" )
// .append( checkConstraint )
// .append( ')' );
// }
// }
//
// buf.append( ')' );
//
// if ( comment != null ) {
// buf.append( dialect.getTableComment( comment ) );
// }
//
// return buf.append( dialect.getTableTypeString() ).toString();
}
@Override

View File

@ -513,10 +513,10 @@ else if ( indexedCollection instanceof org.hibernate.mapping.Map
identifierColumnAlias = col.getAlias( dialect );
// unquotedIdentifierColumnName = identifierColumnAlias;
identifierGenerator = idColl.getIdentifier().createIdentifierGenerator(
creationContext.getMetadata().getIdentifierGeneratorFactory(),
persisterCreationContext.getBootstrapContext().getIdentifierGeneratorFactory(),
factory.getDialect(),
null
);
);
identifierGenerator.initialize( creationContext.getSessionFactory().getSqlStringGenerationContext() );
}
else {

View File

@ -29,7 +29,6 @@
import org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator;
import org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformResolverInitiator;
import org.hibernate.event.internal.EntityCopyObserverFactoryInitiator;
import org.hibernate.id.factory.internal.MutableIdentifierGeneratorFactoryInitiator;
import org.hibernate.persister.internal.PersisterClassResolverInitiator;
import org.hibernate.persister.internal.PersisterFactoryInitiator;
import org.hibernate.property.access.internal.PropertyAccessStrategyResolverInitiator;
@ -79,8 +78,6 @@ private static List<StandardServiceInitiator> buildStandardServiceInitiatorList(
serviceInitiators.add( JdbcServicesInitiator.INSTANCE );
serviceInitiators.add( RefCursorSupportInitiator.INSTANCE );
serviceInitiators.add( MutableIdentifierGeneratorFactoryInitiator.INSTANCE);
serviceInitiators.add( JtaPlatformResolverInitiator.INSTANCE );
serviceInitiators.add( JtaPlatformInitiator.INSTANCE );

View File

@ -18,6 +18,7 @@
import org.hibernate.boot.model.relational.QualifiedName;
import org.hibernate.boot.model.relational.QualifiedNameParser;
import org.hibernate.boot.model.relational.SqlStringGenerationContext;
import org.hibernate.boot.spi.MetadataImplementor;
import org.hibernate.dialect.Dialect;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.Constraint;
@ -36,7 +37,9 @@ public StandardTableExporter(Dialect dialect) {
}
@Override
public String[] getSqlCreateStrings(Table table, Metadata metadata,
public String[] getSqlCreateStrings(
Table table,
Metadata metadata,
SqlStringGenerationContext context) {
final QualifiedName tableName = new QualifiedNameParser.NameParts(
Identifier.toIdentifier( table.getCatalog(), table.isCatalogQuoted() ),
@ -54,7 +57,7 @@ public String[] getSqlCreateStrings(Table table, Metadata metadata,
boolean isPrimaryKeyIdentity = table.hasPrimaryKey()
&& table.getIdentifierValue() != null
&& table.getIdentifierValue().isIdentityColumn( metadata.getIdentifierGeneratorFactory(), dialect );
&& table.getIdentifierValue().isIdentityColumn( ( (MetadataImplementor) metadata ).getMetadataBuildingOptions().getIdentifierGeneratorFactory(), dialect );
// this is the much better form moving forward as we move to metamodel
//boolean isPrimaryKeyIdentity = hasPrimaryKey
// && table.getPrimaryKey().getColumnSpan() == 1

View File

@ -46,13 +46,13 @@ public void testGeneratedUuidId() throws Exception {
.applySetting( AvailableSettings.HBM2DDL_AUTO, "create-drop" )
.build();
try {
Metadata metadata = new MetadataSources( ssr ).addAnnotatedClass( TheEntity.class ).buildMetadata();
( (MetadataImpl) metadata ).validate();
MetadataImpl metadata = (MetadataImpl) new MetadataSources( ssr ).addAnnotatedClass( TheEntity.class ).buildMetadata();
metadata.validate();
PersistentClass entityBinding = metadata.getEntityBinding( TheEntity.class.getName() );
assertEquals( UUID.class, entityBinding.getIdentifier().getType().getReturnedClass() );
IdentifierGenerator generator = entityBinding.getIdentifier().createIdentifierGenerator(
metadata.getIdentifierGeneratorFactory(),
metadata.getMetadataBuildingOptions().getIdentifierGeneratorFactory(),
metadata.getDatabase().getDialect(),
null,
null,

View File

@ -22,12 +22,12 @@
import org.hibernate.id.UUIDGenerator;
import org.hibernate.id.enhanced.DatabaseStructure;
import org.hibernate.id.enhanced.SequenceStyleGenerator;
import org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory;
import org.hibernate.mapping.IdentifierBag;
import org.hibernate.mapping.KeyValue;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.testing.orm.junit.FailureExpectedExtension;
import org.junit.jupiter.api.Test;
@ -61,8 +61,7 @@ public void testAutoDefaults() {
.addAnnotatedClass( Entity2.class )
.buildMetadata();
final DefaultIdentifierGeneratorFactory generatorFactory = new DefaultIdentifierGeneratorFactory();
generatorFactory.injectServices( (ServiceRegistryImplementor) ssr );
final IdentifierGeneratorFactory generatorFactory = new StandardIdentifierGeneratorFactory( ssr );
final PersistentClass entityBinding = metadata.getEntityBinding( Entity1.class.getName() );
final KeyValue idMapping = entityBinding.getRootClass().getIdentifier();
@ -91,8 +90,7 @@ public void testAutoGeneratedValueGenerator() {
.addAnnotatedClass( Entity2.class )
.buildMetadata();
final DefaultIdentifierGeneratorFactory generatorFactory = new DefaultIdentifierGeneratorFactory();
generatorFactory.injectServices( (ServiceRegistryImplementor) ssr );
final IdentifierGeneratorFactory generatorFactory = new StandardIdentifierGeneratorFactory( ssr );
final PersistentClass entityBinding = metadata.getEntityBinding( Entity2.class.getName() );
final KeyValue idMapping = entityBinding.getRootClass().getIdentifier();
@ -120,8 +118,7 @@ public void testCollectionId() {
.addAnnotatedClass( Entity2.class )
.buildMetadata();
final DefaultIdentifierGeneratorFactory generatorFactory = new DefaultIdentifierGeneratorFactory();
generatorFactory.injectServices( (ServiceRegistryImplementor) ssr );
final IdentifierGeneratorFactory generatorFactory = new StandardIdentifierGeneratorFactory( ssr );
final PersistentClass entity1Binding = metadata.getEntityBinding( Entity1.class.getName() );
@ -153,8 +150,7 @@ public void testUuid() {
.addAnnotatedClass( Entity4.class )
.buildMetadata();
final DefaultIdentifierGeneratorFactory generatorFactory = new DefaultIdentifierGeneratorFactory();
generatorFactory.injectServices( (ServiceRegistryImplementor) ssr );
final IdentifierGeneratorFactory generatorFactory = new StandardIdentifierGeneratorFactory( ssr );
final PersistentClass entityBinding = metadata.getEntityBinding( Entity4.class.getName() );
final KeyValue idMapping = entityBinding.getRootClass().getIdentifier();
@ -177,8 +173,7 @@ public void testIncrement() {
.addAnnotatedClass( Entity3.class )
.buildMetadata();
final DefaultIdentifierGeneratorFactory generatorFactory = new DefaultIdentifierGeneratorFactory();
generatorFactory.injectServices( (ServiceRegistryImplementor) ssr );
final IdentifierGeneratorFactory generatorFactory = new StandardIdentifierGeneratorFactory( ssr );
final PersistentClass entityBinding = metadata.getEntityBinding( Entity3.class.getName() );
final KeyValue idMapping = entityBinding.getRootClass().getIdentifier();

View File

@ -43,7 +43,7 @@ public void testIdentifierGeneratorExtendsIdentityGenerator(DomainModelScope sco
final PersistentClass entityBinding = domainModel.getEntityBinding( EntityBean.class.getName() );
final KeyValue identifier = entityBinding.getIdentifier();
assertTrue( identifier.isIdentityColumn( domainModel.getIdentifierGeneratorFactory(), dialect ) );
assertTrue( identifier.isIdentityColumn( domainModel.getMetadataBuildingOptions().getIdentifierGeneratorFactory(), dialect ) );
}
@Entity(name = "EntityBean")

View File

@ -32,7 +32,8 @@
import org.hibernate.dialect.H2Dialect;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.resource.beans.container.spi.BeanContainer;
import org.hibernate.resource.beans.container.spi.BeanContainer.LifecycleOptions;
@ -73,8 +74,7 @@ public void testCreateGeneratorsByBeanContainer() {
.addAnnotatedClass( Entity2.class )
.buildMetadata();
final DefaultIdentifierGeneratorFactory generatorFactory = new DefaultIdentifierGeneratorFactory();
generatorFactory.injectServices( (ServiceRegistryImplementor) ssr );
final IdentifierGeneratorFactory generatorFactory = new StandardIdentifierGeneratorFactory( ssr );
final PersistentClass entityBinding1 = metadata.getEntityBinding( Entity1.class.getName() );
final PersistentClass entityBinding2 = metadata.getEntityBinding( Entity2.class.getName() );

View File

@ -6,14 +6,7 @@
*/
package org.hibernate.orm.test.jpa.compliance.tck2_2;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.SequenceGenerator;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.relational.Database;
@ -22,7 +15,7 @@
import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.boot.spi.MetadataImplementor;
import org.hibernate.dialect.H2Dialect;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.hibernate.id.IdentifierGenerator;
@ -36,6 +29,12 @@
import org.hibernate.testing.junit4.BaseUnitTestCase;
import org.junit.Test;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.SequenceGenerator;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
@ -53,12 +52,12 @@ public class GeneratedValueTests extends BaseUnitTestCase {
@Test
public void baseline() {
try (final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().build()) {
final Metadata bootModel = new MetadataSources( ssr )
final MetadataImplementor bootModel = (MetadataImplementor) new MetadataSources( ssr )
.addAnnotatedClass( ExplicitGeneratorEntity.class )
.buildMetadata();
final PersistentClass entityMapping = bootModel.getEntityBinding( ExplicitGeneratorEntity.class.getName() );
final IdentifierGenerator generator = entityMapping.getIdentifier().createIdentifierGenerator(
bootModel.getIdentifierGeneratorFactory(),
bootModel.getMetadataBuildingOptions().getIdentifierGeneratorFactory(),
ssr.getService( JdbcEnvironment.class ).getDialect(),
null,
null,
@ -81,12 +80,12 @@ public void baseline() {
@Test
public void testImplicitSequenceGenerator() {
try (final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().build()) {
final Metadata bootModel = new MetadataSources( ssr )
final MetadataImplementor bootModel = (MetadataImplementor) new MetadataSources( ssr )
.addAnnotatedClass( ImplicitSequenceGeneratorEntity.class )
.buildMetadata();
final PersistentClass entityMapping = bootModel.getEntityBinding( ImplicitSequenceGeneratorEntity.class.getName() );
final IdentifierGenerator generator = entityMapping.getIdentifier().createIdentifierGenerator(
bootModel.getIdentifierGeneratorFactory(),
bootModel.getMetadataBuildingOptions().getIdentifierGeneratorFactory(),
ssr.getService( JdbcEnvironment.class ).getDialect(),
null,
null,
@ -112,12 +111,12 @@ public void testImplicitSequenceGenerator() {
@Test
public void testImplicitSequenceGeneratorGeneratorName() {
try (final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().build()) {
final Metadata bootModel = new MetadataSources( ssr )
final MetadataImplementor bootModel = (MetadataImplementor) new MetadataSources( ssr )
.addAnnotatedClass( ImplicitSequenceGeneratorEntity.class )
.buildMetadata();
final PersistentClass entityMapping = bootModel.getEntityBinding( ImplicitSequenceGeneratorEntity.class.getName() );
final IdentifierGenerator generator = entityMapping.getIdentifier().createIdentifierGenerator(
bootModel.getIdentifierGeneratorFactory(),
bootModel.getMetadataBuildingOptions().getIdentifierGeneratorFactory(),
ssr.getService( JdbcEnvironment.class ).getDialect(),
null,
null,
@ -144,13 +143,13 @@ public void testImplicitSequenceGeneratorGeneratorName() {
public void testExplicitSequenceGeneratorImplicitNamePreferGeneratorName() {
// this should be the default behavior
try (final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().build()) {
final Metadata bootModel = new MetadataSources( ssr )
final MetadataImplementor bootModel = (MetadataImplementor) new MetadataSources( ssr )
.addAnnotatedClass( ExplicitSequenceGeneratorImplicitNameEntity.class )
.buildMetadata();
final PersistentClass entityMapping = bootModel.getEntityBinding(
ExplicitSequenceGeneratorImplicitNameEntity.class.getName() );
final IdentifierGenerator generator = entityMapping.getIdentifier().createIdentifierGenerator(
bootModel.getIdentifierGeneratorFactory(),
bootModel.getMetadataBuildingOptions().getIdentifierGeneratorFactory(),
ssr.getService( JdbcEnvironment.class ).getDialect(),
null,
null,
@ -191,12 +190,12 @@ public void testExplicitSequenceGeneratorImplicitNamePreferGeneratorName() {
@Test
public void testImplicitTableGenerator() {
try (final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().build()) {
final Metadata bootModel = new MetadataSources( ssr )
final MetadataImplementor bootModel = (MetadataImplementor) new MetadataSources( ssr )
.addAnnotatedClass( ImplicitTableGeneratorEntity.class )
.buildMetadata();
final PersistentClass entityMapping = bootModel.getEntityBinding( ImplicitTableGeneratorEntity.class.getName() );
final IdentifierGenerator generator = entityMapping.getIdentifier().createIdentifierGenerator(
bootModel.getIdentifierGeneratorFactory(),
bootModel.getMetadataBuildingOptions().getIdentifierGeneratorFactory(),
ssr.getService( JdbcEnvironment.class ).getDialect(),
null,
null,
@ -217,12 +216,12 @@ public void testImplicitTableGenerator() {
@Test
public void testExplicitTableGeneratorImplicitName() {
try (final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().build()) {
final Metadata bootModel = new MetadataSources( ssr )
final MetadataImplementor bootModel = (MetadataImplementor) new MetadataSources( ssr )
.addAnnotatedClass( ExplicitTableGeneratorImplicitNameEntity.class )
.buildMetadata();
final PersistentClass entityMapping = bootModel.getEntityBinding( ExplicitTableGeneratorImplicitNameEntity.class.getName() );
final IdentifierGenerator generator = entityMapping.getIdentifier().createIdentifierGenerator(
bootModel.getIdentifierGeneratorFactory(),
bootModel.getMetadataBuildingOptions().getIdentifierGeneratorFactory(),
ssr.getService( JdbcEnvironment.class ).getDialect(),
null,
null,
@ -243,12 +242,12 @@ public void testExplicitTableGeneratorImplicitName() {
@Test
public void testExplicitTableGenerator() {
try (final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().build()) {
final Metadata bootModel = new MetadataSources( ssr )
final MetadataImplementor bootModel = (MetadataImplementor) new MetadataSources( ssr )
.addAnnotatedClass( ExplicitTableGeneratorEntity.class )
.buildMetadata();
final PersistentClass entityMapping = bootModel.getEntityBinding( ExplicitTableGeneratorEntity.class.getName() );
final IdentifierGenerator generator = entityMapping.getIdentifier().createIdentifierGenerator(
bootModel.getIdentifierGeneratorFactory(),
bootModel.getMetadataBuildingOptions().getIdentifierGeneratorFactory(),
ssr.getService( JdbcEnvironment.class ).getDialect(),
null,
null,
@ -271,12 +270,12 @@ public void testExplicitTableGenerator() {
@Test
public void testExplicitIncrementGenerator() {
try (final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().build()) {
final Metadata bootModel = new MetadataSources( ssr )
final MetadataImplementor bootModel = (MetadataImplementor) new MetadataSources( ssr )
.addAnnotatedClass( ExplicitIncrementGeneratorEntity.class )
.buildMetadata();
final PersistentClass entityMapping = bootModel.getEntityBinding( ExplicitIncrementGeneratorEntity.class.getName() );
final IdentifierGenerator generator = entityMapping.getIdentifier().createIdentifierGenerator(
bootModel.getIdentifierGeneratorFactory(),
bootModel.getMetadataBuildingOptions().getIdentifierGeneratorFactory(),
ssr.getService( JdbcEnvironment.class ).getDialect(),
null,
null,
@ -291,12 +290,12 @@ public void testExplicitIncrementGenerator() {
@Test
public void testImplicitIncrementGenerator() {
try (final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().build()) {
final Metadata bootModel = new MetadataSources( ssr )
final MetadataImplementor bootModel = (MetadataImplementor) new MetadataSources( ssr )
.addAnnotatedClass( ImplicitIncrementGeneratorEntity.class )
.buildMetadata();
final PersistentClass entityMapping = bootModel.getEntityBinding( ImplicitIncrementGeneratorEntity.class.getName() );
final IdentifierGenerator generator = entityMapping.getIdentifier().createIdentifierGenerator(
bootModel.getIdentifierGeneratorFactory(),
bootModel.getMetadataBuildingOptions().getIdentifierGeneratorFactory(),
ssr.getService( JdbcEnvironment.class ).getDialect(),
null,
null,