diff --git a/hibernate-core/src/main/java/org/hibernate/boot/MetadataBuilder.java b/hibernate-core/src/main/java/org/hibernate/boot/MetadataBuilder.java index 104a9fc67f70..7195002008ef 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/MetadataBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/MetadataBuilder.java @@ -146,7 +146,10 @@ public interface MetadataBuilder { * @param jandexView The Jandex index to use. * * @return {@code this}, for method chaining + * + * @deprecated Set the {@code hibernate-models} setting {@code hibernate.models.jandex.index} instead. This method has no effect. */ + @Deprecated MetadataBuilder applyIndexView(Object jandexView); /** diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/BootstrapContextImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/BootstrapContextImpl.java index 6ed232ad86bb..bd6a12f52b05 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/BootstrapContextImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/BootstrapContextImpl.java @@ -4,11 +4,6 @@ */ package org.hibernate.boot.internal; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - import org.hibernate.AssertionFailure; import org.hibernate.boot.CacheRegionDefinition; import org.hibernate.boot.archive.scan.internal.StandardScanOptions; @@ -18,6 +13,8 @@ import org.hibernate.boot.archive.spi.ArchiveDescriptorFactory; import org.hibernate.boot.model.convert.spi.ConverterDescriptor; import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject; +import org.hibernate.boot.models.internal.ClassLoaderServiceLoading; +import org.hibernate.boot.models.internal.ModelsHelper; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.selector.spi.StrategySelector; @@ -31,15 +28,21 @@ import org.hibernate.jpa.spi.MutableJpaCompliance; import org.hibernate.metamodel.internal.ManagedTypeRepresentationResolverStandard; import org.hibernate.metamodel.spi.ManagedTypeRepresentationResolver; +import org.hibernate.models.spi.ModelsConfiguration; +import org.hibernate.models.spi.SourceModelBuildingContext; import org.hibernate.query.sqm.function.SqmFunctionDescriptor; import org.hibernate.query.sqm.function.SqmFunctionRegistry; import org.hibernate.resource.beans.spi.BeanInstanceProducer; import org.hibernate.resource.beans.spi.ManagedBeanRegistry; import org.hibernate.type.BasicType; import org.hibernate.type.spi.TypeConfiguration; - import org.jboss.logging.Logger; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + import static java.util.Collections.emptyList; import static java.util.Collections.emptyMap; @@ -70,8 +73,6 @@ public class BootstrapContextImpl implements BootstrapContext { private Object scannerSetting; private ArchiveDescriptorFactory archiveDescriptorFactory; - private Object jandexView; - private HashMap sqlFunctionMap; private ArrayList auxiliaryDatabaseObjectList; private HashMap, ConverterDescriptor> attributeConverterDescriptorMap; @@ -79,6 +80,8 @@ public class BootstrapContextImpl implements BootstrapContext { private final ManagedTypeRepresentationResolver representationStrategySelector; private final ConfigurationService configurationService; + private final SourceModelBuildingContext modelsContext; + public BootstrapContextImpl( StandardServiceRegistry serviceRegistry, MetadataBuildingOptions metadataBuildingOptions) { @@ -113,6 +116,8 @@ public BootstrapContextImpl( managedBeanRegistry = serviceRegistry.requireService( ManagedBeanRegistry.class ); configurationService = serviceRegistry.requireService( ConfigurationService.class ); + + modelsContext = createModelBuildingContext( classLoaderService, configService ); } @Override @@ -130,6 +135,11 @@ public TypeConfiguration getTypeConfiguration() { return typeConfiguration; } + @Override + public SourceModelBuildingContext getModelsContext() { + return modelsContext; + } + @Override public SqmFunctionRegistry getFunctionRegistry() { return sqmFunctionRegistry; @@ -207,7 +217,7 @@ public Object getScanner() { @Override public Object getJandexView() { - return jandexView; + return null; } @Override @@ -254,7 +264,6 @@ public void release() { scanEnvironment = null; scannerSetting = null; archiveDescriptorFactory = null; - jandexView = null; if ( sqlFunctionMap != null ) { sqlFunctionMap.clear(); @@ -323,11 +332,6 @@ void injectArchiveDescriptorFactory(ArchiveDescriptorFactory factory) { this.archiveDescriptorFactory = factory; } - void injectJandexView(Object jandexView) { - log.debugf( "Injecting Jandex IndexView [%s] into BootstrapContext; was [%s]", jandexView, this.jandexView ); - this.jandexView = jandexView; - } - public void addSqlFunction(String functionName, SqmFunctionDescriptor function) { if ( sqlFunctionMap == null ) { sqlFunctionMap = new HashMap<>(); @@ -349,4 +353,20 @@ public void addCacheRegionDefinition(CacheRegionDefinition cacheRegionDefinition } cacheRegionDefinitions.add( cacheRegionDefinition ); } + + public static SourceModelBuildingContext createModelBuildingContext( + ClassLoaderService classLoaderService, + ConfigurationService configService) { + final ClassLoaderServiceLoading classLoading = new ClassLoaderServiceLoading( classLoaderService ); + + final ModelsConfiguration modelsConfiguration = new ModelsConfiguration(); + modelsConfiguration.setClassLoading( classLoading ); + modelsConfiguration.setRegistryPrimer( ModelsHelper::preFillRegistries ); + configService.getSettings().forEach( (key, value) -> { + if ( key.startsWith( "hibernate.models." ) ) { + modelsConfiguration.configValue( key, value ); + } + } ); + return modelsConfiguration.bootstrap(); + } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java index aaf955d1a32d..b427c917ece9 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java @@ -4,20 +4,10 @@ */ package org.hibernate.boot.internal; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; - +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Embeddable; +import jakarta.persistence.Entity; +import jakarta.persistence.MapsId; import org.hibernate.AnnotationException; import org.hibernate.AssertionFailure; import org.hibernate.DuplicateMappingException; @@ -59,9 +49,7 @@ import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.model.source.internal.ImplicitColumnNamingSecondPass; import org.hibernate.boot.model.source.spi.LocalMetadataBuildingContext; -import org.hibernate.boot.models.internal.ClassLoaderServiceLoading; import org.hibernate.boot.models.internal.GlobalRegistrationsImpl; -import org.hibernate.boot.models.internal.ModelsHelper; import org.hibernate.boot.models.spi.GlobalRegistrations; import org.hibernate.boot.models.xml.internal.PersistenceUnitMetadataImpl; import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata; @@ -104,8 +92,6 @@ import org.hibernate.metamodel.mapping.DiscriminatorType; import org.hibernate.metamodel.spi.EmbeddableInstantiator; import org.hibernate.models.spi.ClassDetails; -import org.hibernate.models.spi.ModelsConfiguration; -import org.hibernate.models.spi.SourceModelBuildingContext; import org.hibernate.query.named.NamedObjectRepository; import org.hibernate.query.sqm.function.SqmFunctionDescriptor; import org.hibernate.query.sqm.function.SqmFunctionRegistry; @@ -115,10 +101,19 @@ import org.hibernate.usertype.CompositeUserType; import org.hibernate.usertype.UserType; -import jakarta.persistence.AttributeConverter; -import jakarta.persistence.Embeddable; -import jakarta.persistence.Entity; -import jakarta.persistence.MapsId; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; import static org.hibernate.boot.model.naming.Identifier.toIdentifier; import static org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl.fromExplicit; @@ -193,19 +188,15 @@ public class InFlightMetadataCollectorImpl private Set delayedPropertyReferenceHandlers; private List> valueResolvers; - private final SourceModelBuildingContext sourceModelBuildingContext; - public InFlightMetadataCollectorImpl( BootstrapContext bootstrapContext, - SourceModelBuildingContext sourceModelBuildingContext, MetadataBuildingOptions options) { this.bootstrapContext = bootstrapContext; - this.sourceModelBuildingContext = sourceModelBuildingContext; this.options = options; uuid = UUID.randomUUID(); - globalRegistrations = new GlobalRegistrationsImpl( sourceModelBuildingContext, bootstrapContext ); + globalRegistrations = new GlobalRegistrationsImpl( bootstrapContext.getModelsContext(), bootstrapContext ); persistenceUnitMetadata = new PersistenceUnitMetadataImpl(); for ( Map.Entry sqlFunctionEntry : bootstrapContext.getSqlFunctions().entrySet() ) { @@ -222,21 +213,6 @@ public InFlightMetadataCollectorImpl( configurationService = bootstrapContext.getConfigurationService(); } - public InFlightMetadataCollectorImpl(BootstrapContext bootstrapContext, MetadataBuildingOptions options) { - this( bootstrapContext, createModelBuildingContext( bootstrapContext ), options ); - } - - private static SourceModelBuildingContext createModelBuildingContext(BootstrapContext bootstrapContext) { - final ClassLoaderServiceLoading classLoading = - new ClassLoaderServiceLoading( bootstrapContext.getClassLoaderService() ); - - final ModelsConfiguration modelsConfiguration = new ModelsConfiguration(); - modelsConfiguration.setClassLoading( classLoading ); - modelsConfiguration.configValue( "hibernate.models.jandex.index", bootstrapContext.getJandexView() ); - modelsConfiguration.setRegistryPrimer( ModelsHelper::preFillRegistries ); - return modelsConfiguration.bootstrap(); - } - @Override public UUID getUUID() { return null; @@ -252,11 +228,6 @@ public BootstrapContext getBootstrapContext() { return bootstrapContext; } - @Override - public SourceModelBuildingContext getSourceModelBuildingContext() { - return sourceModelBuildingContext; - } - @Override public GlobalRegistrations getGlobalRegistrations() { return globalRegistrations; diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java index 4c9d222dd3fc..1179dc880ab2 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java @@ -212,7 +212,6 @@ public MetadataBuilder applyAccessType(AccessType implicitCacheAccessType) { @Override public MetadataBuilder applyIndexView(Object jandexView) { - bootstrapContext.injectJandexView( jandexView ); return this; } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AbstractEntityIdGeneratorResolver.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AbstractEntityIdGeneratorResolver.java index 6ca7f92c7c68..fa3c7b089c5c 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AbstractEntityIdGeneratorResolver.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AbstractEntityIdGeneratorResolver.java @@ -149,7 +149,7 @@ protected boolean handleAsMetaAnnotated() { private Annotation findGeneratorAnnotation(AnnotationTarget annotationTarget) { final List metaAnnotated = annotationTarget.getMetaAnnotated( IdGeneratorType.class, - buildingContext.getMetadataCollector().getSourceModelBuildingContext() ); + buildingContext.getBootstrapContext().getModelsContext() ); if ( CollectionHelper.size( metaAnnotated ) > 0 ) { return metaAnnotated.get( 0 ); } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AbstractPropertyHolder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AbstractPropertyHolder.java index 08eae34cf196..4784ba25b2d4 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AbstractPropertyHolder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AbstractPropertyHolder.java @@ -175,7 +175,7 @@ protected MetadataBuildingContext getContext() { } protected SourceModelBuildingContext getSourceModelContext() { - return getContext().getMetadataCollector().getSourceModelBuildingContext(); + return getContext().getBootstrapContext().getModelsContext(); } /** @@ -438,7 +438,7 @@ private static Map buildColumnOverride( } final SourceModelBuildingContext sourceModelContext = - context.getMetadataCollector().getSourceModelBuildingContext(); + context.getBootstrapContext().getModelsContext(); final Map> columnOverrideMap = new HashMap<>(); final AttributeOverride[] overrides = @@ -492,7 +492,7 @@ private static Column createTimeZoneColumn( Column column, MetadataBuildingContext context) { final TimeZoneColumn timeZoneColumn = element.getDirectAnnotationUsage( TimeZoneColumn.class ); - final ColumnJpaAnnotation created = JpaAnnotations.COLUMN.createUsage( context.getMetadataCollector().getSourceModelBuildingContext() ); + final ColumnJpaAnnotation created = JpaAnnotations.COLUMN.createUsage( context.getBootstrapContext().getModelsContext() ); final String columnName = timeZoneColumn != null ? timeZoneColumn.name() : column.name() + "_tz"; @@ -563,7 +563,7 @@ public MetadataBuildingContext getBuildingContext() { ); final ColumnJpaAnnotation created = - JpaAnnotations.COLUMN.createUsage( context.getMetadataCollector().getSourceModelBuildingContext() ); + JpaAnnotations.COLUMN.createUsage( context.getBootstrapContext().getModelsContext() ); if ( StringHelper.isNotEmpty( implicitName.getText() ) ) { created.name( implicitName.getText() ); } @@ -573,7 +573,7 @@ public MetadataBuildingContext getBuildingContext() { } private static Map buildColumnTransformerOverride(AnnotationTarget element, MetadataBuildingContext context) { - final SourceModelBuildingContext sourceModelContext = context.getMetadataCollector().getSourceModelBuildingContext(); + final SourceModelBuildingContext sourceModelContext = context.getBootstrapContext().getModelsContext(); final Map columnOverride = new HashMap<>(); if ( element != null ) { element.forEachAnnotationUsage( ColumnTransformer.class, sourceModelContext, (usage) -> { @@ -604,7 +604,7 @@ private static Map buildForeignKeyOverride(AnnotationTarget } private static AssociationOverride[] buildAssociationOverrides(AnnotationTarget element, String path, MetadataBuildingContext context) { - return element.getRepeatedAnnotationUsages( AssociationOverride.class, context.getMetadataCollector().getSourceModelBuildingContext() ); + return element.getRepeatedAnnotationUsages( AssociationOverride.class, context.getBootstrapContext().getModelsContext() ); } private static Map buildJoinTableOverride(AnnotationTarget element, String path, MetadataBuildingContext context) { diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AnnotatedColumn.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AnnotatedColumn.java index fed00e8ae514..f2c80d6347b1 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AnnotatedColumn.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AnnotatedColumn.java @@ -795,7 +795,7 @@ private static AnnotatedColumns buildExplicitColumns( fractionalSeconds, sqlType, tableName, - context.getMetadataCollector().getSourceModelBuildingContext() + context.getBootstrapContext().getModelsContext() ); } return parent; @@ -1050,7 +1050,7 @@ private static AnnotatedColumns buildImplicitColumn( column.applyColumnDefault( inferredData, 1 ); column.applyGeneratedAs( inferredData, 1 ); column.applyCheckConstraint( inferredData, 1 ); - column.extractDataFromPropertyData( propertyHolder, inferredData, context.getMetadataCollector().getSourceModelBuildingContext() ); + column.extractDataFromPropertyData( propertyHolder, inferredData, context.getBootstrapContext().getModelsContext() ); column.handleArrayLength( inferredData ); if ( fractionalSeconds != null ) { column.setTemporalPrecision( fractionalSeconds.value() ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AnnotationBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AnnotationBinder.java index f5d0f35bf0db..041806c03f02 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AnnotationBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AnnotationBinder.java @@ -123,8 +123,8 @@ public static void bindDefaults(MetadataBuildingContext context) { } - private static SourceModelBuildingContext sourceContext(MetadataBuildingContext context) { - return context.getMetadataCollector().getSourceModelBuildingContext(); + private static SourceModelBuildingContext modelsContext(MetadataBuildingContext context) { + return context.getBootstrapContext().getModelsContext(); } public static void bindPackage(ClassLoaderService cls, String packageName, MetadataBuildingContext context) { @@ -133,7 +133,7 @@ public static void bindPackage(ClassLoaderService cls, String packageName, Metad return; } final ClassDetails packageInfoClassDetails = - sourceContext( context ).getClassDetailsRegistry() + modelsContext( context ).getClassDetailsRegistry() .resolveClassDetails( pack.getName() + ".package-info" ); GeneratorBinder.registerGlobalGenerators( packageInfoClassDetails, context ); @@ -153,7 +153,7 @@ public static void bindPackage(ClassLoaderService cls, String packageName, Metad private static void bindNamedEntityGraphs(ClassDetails packageInfoClassDetails, MetadataBuildingContext context) { packageInfoClassDetails.forEachRepeatedAnnotationUsages( HibernateAnnotations.NAMED_ENTITY_GRAPH, - context.getMetadataCollector().getSourceModelBuildingContext(), + modelsContext( context ), (annotation) -> { final NamedEntityGraphDefinition graphDefinition = new NamedEntityGraphDefinition( annotation ); context.getMetadataCollector().addNamedEntityGraph( graphDefinition ); @@ -167,7 +167,7 @@ public static void bindQueries(AnnotationTarget annotationTarget, MetadataBuildi } private static void bindNamedHibernateQueries(AnnotationTarget annotationTarget, MetadataBuildingContext context) { - final SourceModelBuildingContext sourceModelContext = sourceContext( context ); + final SourceModelBuildingContext sourceModelContext = modelsContext( context ); annotationTarget.forEachRepeatedAnnotationUsages( HibernateAnnotations.NAMED_QUERY, @@ -183,7 +183,7 @@ private static void bindNamedHibernateQueries(AnnotationTarget annotationTarget, } private static void bindNamedJpaQueries(AnnotationTarget annotationTarget, MetadataBuildingContext context) { - final SourceModelBuildingContext sourceModelContext = sourceContext( context ); + final SourceModelBuildingContext sourceModelContext = modelsContext( context ); annotationTarget.forEachRepeatedAnnotationUsages( JpaAnnotations.SQL_RESULT_SET_MAPPING, @@ -274,7 +274,7 @@ private static void bindTypeDescriptorRegistrations( final ManagedBeanRegistry managedBeanRegistry = context.getBootstrapContext().getManagedBeanRegistry(); - final SourceModelBuildingContext sourceModelContext = sourceContext( context ); + final SourceModelBuildingContext sourceModelContext = modelsContext( context ); annotatedElement.forEachAnnotationUsage( JavaTypeRegistration.class, sourceModelContext, (usage) -> { handleJavaTypeRegistration( context, managedBeanRegistry, usage ); @@ -321,7 +321,7 @@ private static void handleJavaTypeRegistration( private static void bindEmbeddableInstantiatorRegistrations( AnnotationTarget annotatedElement, MetadataBuildingContext context) { - annotatedElement.forEachAnnotationUsage( EmbeddableInstantiatorRegistration.class, sourceContext( context ), (usage) -> { + annotatedElement.forEachAnnotationUsage( EmbeddableInstantiatorRegistration.class, modelsContext( context ), (usage) -> { handleEmbeddableInstantiatorRegistration( context, usage ); } ); } @@ -338,7 +338,7 @@ private static void handleEmbeddableInstantiatorRegistration( private static void bindCompositeUserTypeRegistrations( AnnotationTarget annotatedElement, MetadataBuildingContext context) { - annotatedElement.forEachAnnotationUsage( CompositeTypeRegistration.class, sourceContext( context ), (usage) -> { + annotatedElement.forEachAnnotationUsage( CompositeTypeRegistration.class, modelsContext( context ), (usage) -> { handleCompositeUserTypeRegistration( context, usage ); } ); } @@ -346,7 +346,7 @@ private static void bindCompositeUserTypeRegistrations( private static void bindUserTypeRegistrations( AnnotationTarget annotatedElement, MetadataBuildingContext context) { - annotatedElement.forEachAnnotationUsage( TypeRegistration.class, sourceContext( context ), (usage) -> { + annotatedElement.forEachAnnotationUsage( TypeRegistration.class, modelsContext( context ), (usage) -> { handleUserTypeRegistration( context, usage ); } ); } @@ -374,7 +374,7 @@ private static void handleCompositeUserTypeRegistration( } private static void bindConverterRegistrations(AnnotationTarget container, MetadataBuildingContext context) { - final SourceModelBuildingContext sourceModelContext = sourceContext( context ); + final SourceModelBuildingContext sourceModelContext = modelsContext( context ); container.forEachAnnotationUsage( ConverterRegistration.class, sourceModelContext, (usage) -> { handleConverterRegistration( usage, context ); } ); @@ -404,7 +404,7 @@ public static void bindFetchProfilesForPackage(ClassLoaderService cls, String pa } private static void bindFetchProfiles(AnnotationTarget annotatedElement, MetadataBuildingContext context) { - annotatedElement.forEachAnnotationUsage( FetchProfile.class, sourceContext( context ), (usage) -> { + annotatedElement.forEachAnnotationUsage( FetchProfile.class, modelsContext( context ), (usage) -> { bindFetchProfile( usage, context ); } ); } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/BasicValueBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/BasicValueBinder.java index b4635a27380f..52c1ebedf681 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/BasicValueBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/BasicValueBinder.java @@ -4,19 +4,23 @@ */ package org.hibernate.boot.model.internal; -import java.lang.annotation.Annotation; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; - +import jakarta.persistence.ElementCollection; import jakarta.persistence.Embedded; import jakarta.persistence.EmbeddedId; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; +import jakarta.persistence.MapKeyClass; +import jakarta.persistence.MapKeyEnumerated; +import jakarta.persistence.MapKeyTemporal; import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; +import jakarta.persistence.Version; import org.hibernate.AnnotationException; import org.hibernate.AssertionFailure; import org.hibernate.MappingException; @@ -55,17 +59,12 @@ import org.hibernate.usertype.DynamicParameterizedType; import org.hibernate.usertype.UserType; -import jakarta.persistence.ElementCollection; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.Id; -import jakarta.persistence.Lob; -import jakarta.persistence.MapKeyClass; -import jakarta.persistence.MapKeyEnumerated; -import jakarta.persistence.MapKeyTemporal; -import jakarta.persistence.Temporal; -import jakarta.persistence.TemporalType; -import jakarta.persistence.Version; +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; import static java.util.Collections.emptyMap; import static org.hibernate.boot.model.internal.AnnotationHelper.extractParameterMap; @@ -152,7 +151,7 @@ public BasicValueBinder(Kind kind, Component aggregateComponent, MetadataBuildin } protected SourceModelBuildingContext getSourceModelContext() { - return getMetadataCollector().getSourceModelBuildingContext(); + return buildingContext.getBootstrapContext().getModelsContext(); } private InFlightMetadataCollector getMetadataCollector() { diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/BinderHelper.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/BinderHelper.java index 237526c399f6..29b9726a4faf 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/BinderHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/BinderHelper.java @@ -4,17 +4,11 @@ */ package org.hibernate.boot.model.internal; -import java.lang.annotation.Annotation; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.function.Consumer; - +import jakarta.persistence.ConstraintMode; +import jakarta.persistence.FetchType; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToOne; import org.hibernate.AnnotationException; import org.hibernate.AssertionFailure; import org.hibernate.FetchMode; @@ -54,11 +48,16 @@ import org.hibernate.models.spi.TypeDetails; import org.hibernate.type.descriptor.java.JavaType; -import jakarta.persistence.ConstraintMode; -import jakarta.persistence.FetchType; -import jakarta.persistence.ForeignKey; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToOne; +import java.lang.annotation.Annotation; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.function.Consumer; import static jakarta.persistence.ConstraintMode.NO_CONSTRAINT; import static jakarta.persistence.ConstraintMode.PROVIDER_DEFAULT; @@ -790,7 +789,7 @@ public static Any buildAnyValue( discriminatorJavaType.wrap( valueMapping.discriminator(), null ), valueMapping.entity() ), - context.getMetadataCollector().getSourceModelBuildingContext() + context.getBootstrapContext().getModelsContext() ); value.setDiscriminatorValueMappings( discriminatorValueMappings ); @@ -1070,12 +1069,12 @@ public static A extractFromPackage( return null; } else { - final SourceModelBuildingContext sourceModelContext = - context.getMetadataCollector().getSourceModelBuildingContext(); + final SourceModelBuildingContext modelsContext = + context.getBootstrapContext().getModelsContext(); try { - return sourceModelContext.getClassDetailsRegistry() + return modelsContext.getClassDetailsRegistry() .resolveClassDetails( packageName + ".package-info" ) - .getAnnotationUsage( annotationType, sourceModelContext ); + .getAnnotationUsage( annotationType, modelsContext ); } catch (ClassLoadingException ignore) { return null; diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/CollectionBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/CollectionBinder.java index a5eedc577108..52b6772748a8 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/CollectionBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/CollectionBinder.java @@ -264,36 +264,36 @@ public static void bindCollection( Map inheritanceStatePerClass, MemberDetails property, AnnotatedJoinColumns joinColumns) { - final SourceModelBuildingContext sourceModelContext = context.getMetadataCollector().getSourceModelBuildingContext(); + final SourceModelBuildingContext modelsContext = context.getBootstrapContext().getModelsContext(); - final OneToMany oneToManyAnn = property.getAnnotationUsage( OneToMany.class, sourceModelContext ); - final ManyToMany manyToManyAnn = property.getAnnotationUsage( ManyToMany.class, sourceModelContext ); - final ElementCollection elementCollectionAnn = property.getAnnotationUsage( ElementCollection.class, sourceModelContext ); + final OneToMany oneToManyAnn = property.getAnnotationUsage( OneToMany.class, modelsContext ); + final ManyToMany manyToManyAnn = property.getAnnotationUsage( ManyToMany.class, modelsContext ); + final ElementCollection elementCollectionAnn = property.getAnnotationUsage( ElementCollection.class, modelsContext ); checkAnnotations( propertyHolder, inferredData, property, oneToManyAnn, manyToManyAnn, elementCollectionAnn ); final CollectionBinder collectionBinder = getCollectionBinder( property, hasMapKeyAnnotation( property ), context ); collectionBinder.setIndexColumn( getIndexColumn( propertyHolder, inferredData, entityBinder, context, property ) ); - collectionBinder.setMapKey( property.getAnnotationUsage( MapKey.class, sourceModelContext ) ); + collectionBinder.setMapKey( property.getAnnotationUsage( MapKey.class, modelsContext ) ); collectionBinder.setPropertyName( inferredData.getPropertyName() ); - collectionBinder.setJpaOrderBy( property.getAnnotationUsage( OrderBy.class, sourceModelContext ) ); + collectionBinder.setJpaOrderBy( property.getAnnotationUsage( OrderBy.class, modelsContext ) ); collectionBinder.setSqlOrder( getOverridableAnnotation( property, SQLOrder.class, context ) ); - collectionBinder.setNaturalSort( property.getAnnotationUsage( SortNatural.class, sourceModelContext ) ); - collectionBinder.setComparatorSort( property.getAnnotationUsage( SortComparator.class, sourceModelContext ) ); - collectionBinder.setCache( property.getAnnotationUsage( Cache.class, sourceModelContext ) ); - collectionBinder.setQueryCacheLayout( property.getAnnotationUsage( QueryCacheLayout.class, sourceModelContext ) ); + collectionBinder.setNaturalSort( property.getAnnotationUsage( SortNatural.class, modelsContext ) ); + collectionBinder.setComparatorSort( property.getAnnotationUsage( SortComparator.class, modelsContext ) ); + collectionBinder.setCache( property.getAnnotationUsage( Cache.class, modelsContext ) ); + collectionBinder.setQueryCacheLayout( property.getAnnotationUsage( QueryCacheLayout.class, modelsContext ) ); collectionBinder.setPropertyHolder(propertyHolder); - collectionBinder.setNotFoundAction( notFoundAction( propertyHolder, inferredData, property, manyToManyAnn, sourceModelContext ) ); + collectionBinder.setNotFoundAction( notFoundAction( propertyHolder, inferredData, property, manyToManyAnn, modelsContext ) ); collectionBinder.setElementType( inferredData.getClassOrElementType() ); collectionBinder.setAccessType( inferredData.getDefaultAccess() ); - collectionBinder.setEmbedded( property.hasAnnotationUsage( Embedded.class, sourceModelContext ) ); + collectionBinder.setEmbedded( property.hasAnnotationUsage( Embedded.class, modelsContext ) ); collectionBinder.setProperty( property ); collectionBinder.setOnDeleteActionAction( onDeleteAction( property ) ); collectionBinder.setInheritanceStatePerClass( inheritanceStatePerClass ); collectionBinder.setDeclaringClass( inferredData.getDeclaringClass() ); // final Comment comment = property.getAnnotation( Comment.class ); - final Cascade hibernateCascade = property.getAnnotationUsage( Cascade.class, sourceModelContext ); + final Cascade hibernateCascade = property.getAnnotationUsage( Cascade.class, modelsContext ); collectionBinder.setElementColumns( elementColumns( propertyHolder, @@ -349,7 +349,7 @@ public static void bindCollection( collectionBinder.setUpdatable( false ); } - if ( property.hasAnnotationUsage( CollectionId.class, sourceModelContext ) ) { + if ( property.hasAnnotationUsage( CollectionId.class, modelsContext ) ) { //do not compute the generators unless necessary final HashMap availableGenerators = new HashMap<>(); visitIdGeneratorDefinitions( @@ -634,9 +634,11 @@ else if ( property.hasDirectAnnotationUsage( Columns.class ) ) { private static JoinColumn[] mapKeyJoinColumnAnnotations( MemberDetails property, MetadataBuildingContext context) { + final SourceModelBuildingContext modelsContext = context.getBootstrapContext().getModelsContext(); + final MapKeyJoinColumn[] mapKeyJoinColumns = property.getRepeatedAnnotationUsages( JpaAnnotations.MAP_KEY_JOIN_COLUMN, - context.getMetadataCollector().getSourceModelBuildingContext() + modelsContext ); if ( isEmpty( mapKeyJoinColumns ) ) { @@ -647,7 +649,7 @@ private static JoinColumn[] mapKeyJoinColumnAnnotations( for ( int i = 0; i < mapKeyJoinColumns.length; i++ ) { final JoinColumn joinColumn = JoinColumnJpaAnnotation.toJoinColumn( mapKeyJoinColumns[i], - context.getMetadataCollector().getSourceModelBuildingContext() + modelsContext ); joinColumns[i] = joinColumn; } @@ -665,7 +667,7 @@ private static AnnotatedColumns mapKeyColumns( if ( property.hasDirectAnnotationUsage( MapKeyColumn.class ) ) { column = MapKeyColumnJpaAnnotation.toColumnAnnotation( property.getDirectAnnotationUsage( MapKeyColumn.class ), - context.getMetadataCollector().getSourceModelBuildingContext() + context.getBootstrapContext().getModelsContext() ); } else { @@ -849,7 +851,7 @@ private static CollectionBinder getCollectionBinder( final CollectionBinder binder; final CollectionType typeAnnotation = property.getAnnotationUsage( CollectionType.class, - buildingContext.getMetadataCollector().getSourceModelBuildingContext() ); + buildingContext.getBootstrapContext().getModelsContext() ); binder = typeAnnotation != null ? createBinderFromCustomTypeAnnotation( property, typeAnnotation, buildingContext ) : createBinderAutomatically( property, buildingContext ); @@ -955,20 +957,18 @@ private static CollectionClassification determineCollectionClassification( return CollectionClassification.ARRAY; } - final SourceModelBuildingContext sourceModelContext = - buildingContext.getMetadataCollector().getSourceModelBuildingContext(); - - if ( !property.hasAnnotationUsage( Bag.class, sourceModelContext ) ) { + final SourceModelBuildingContext modelsContext = buildingContext.getBootstrapContext().getModelsContext(); + if ( !property.hasAnnotationUsage( Bag.class, modelsContext ) ) { return determineCollectionClassification( determineSemanticJavaType( property ), property, buildingContext ); } - if ( property.hasAnnotationUsage( OrderColumn.class, sourceModelContext ) ) { + if ( property.hasAnnotationUsage( OrderColumn.class, modelsContext ) ) { throw new AnnotationException( "Attribute '" + qualify( property.getDeclaringType().getName(), property.getName() ) + "' is annotated '@Bag' and may not also be annotated '@OrderColumn'" ); } - if ( property.hasAnnotationUsage( ListIndexBase.class, sourceModelContext ) ) { + if ( property.hasAnnotationUsage( ListIndexBase.class, modelsContext ) ) { throw new AnnotationException( "Attribute '" + qualify( property.getDeclaringType().getName(), property.getName() ) + "' is annotated '@Bag' and may not also be annotated '@ListIndexBase'" ); @@ -1026,15 +1026,15 @@ private static CollectionClassification determineCollectionClassification( return CollectionClassification.BAG; } - final SourceModelBuildingContext sourceModelContext = - buildingContext.getMetadataCollector().getSourceModelBuildingContext(); - final ManyToMany manyToMany = property.getAnnotationUsage( ManyToMany.class, sourceModelContext ); + final SourceModelBuildingContext modelsContext = + buildingContext.getBootstrapContext().getModelsContext(); + final ManyToMany manyToMany = property.getAnnotationUsage( ManyToMany.class, modelsContext ); if ( manyToMany != null && !manyToMany.mappedBy().isBlank() ) { // We don't support @OrderColumn on the non-owning side of a many-to-many association. return CollectionClassification.BAG; } - final OneToMany oneToMany = property.getAnnotationUsage( OneToMany.class, sourceModelContext ); + final OneToMany oneToMany = property.getAnnotationUsage( OneToMany.class, modelsContext ); if ( oneToMany != null && !oneToMany.mappedBy().isBlank() ) { // Unowned to-many mappings are always considered BAG by default return CollectionClassification.BAG; @@ -1112,7 +1112,7 @@ private void setElementType(TypeDetails collectionElementType) { } private void setTargetEntity(Class targetEntity) { - setTargetEntity( sourceModelContext().getClassDetailsRegistry() + setTargetEntity( modelsContext().getClassDetailsRegistry() .resolveClassDetails( targetEntity.getName() ) ); } @@ -1460,12 +1460,12 @@ private void defineFetchingStrategy() { handleFetchProfileOverrides(); } - private SourceModelBuildingContext sourceModelContext() { - return getMetadataCollector().getSourceModelBuildingContext(); + private SourceModelBuildingContext modelsContext() { + return buildingContext.getBootstrapContext().getModelsContext(); } private void handleFetchProfileOverrides() { - property.forEachAnnotationUsage( FetchProfileOverride.class, sourceModelContext(), (usage) -> { + property.forEachAnnotationUsage( FetchProfileOverride.class, modelsContext(), (usage) -> { getMetadataCollector().addSecondPass( new FetchSecondPass( usage, propertyHolder, @@ -1723,10 +1723,10 @@ private String toPhysicalName(String logicalName) { } private void bindFilters(boolean hasAssociationTable) { - property.forEachAnnotationUsage( Filter.class, sourceModelContext(), + property.forEachAnnotationUsage( Filter.class, modelsContext(), usage -> addFilter( hasAssociationTable, usage ) ); - property.forEachAnnotationUsage( FilterJoinTable.class, sourceModelContext(), + property.forEachAnnotationUsage( FilterJoinTable.class, modelsContext(), usage -> addFilterJoinTable( hasAssociationTable, usage ) ); } @@ -2480,9 +2480,9 @@ private void handleOwnedManyToMany(PersistentClass collectionEntity, boolean isC } private void handleCheckConstraints(Table collectionTable) { - property.forEachAnnotationUsage( Check.class, sourceModelContext(), + property.forEachAnnotationUsage( Check.class, modelsContext(), usage -> addCheckToCollection( collectionTable, usage ) ); - property.forEachAnnotationUsage( jakarta.persistence.JoinTable.class, sourceModelContext(), (usage) -> { + property.forEachAnnotationUsage( jakarta.persistence.JoinTable.class, modelsContext(), (usage) -> { TableBinder.addTableCheck( collectionTable, usage.check() ); TableBinder.addTableComment( collectionTable, usage.comment() ); TableBinder.addTableOptions( collectionTable, usage.options() ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ColumnsBuilder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ColumnsBuilder.java index b9944a2ae4c2..67c98489b2a9 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ColumnsBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ColumnsBuilder.java @@ -239,10 +239,10 @@ private AnnotatedJoinColumns buildExplicitJoinColumns(MemberDetails property, Pr } private JoinColumnOrFormula[] joinColumnOrFormulaAnnotations(MemberDetails property, PropertyData inferredData) { - final SourceModelBuildingContext sourceModelContext = buildingContext.getMetadataCollector().getSourceModelBuildingContext(); + final SourceModelBuildingContext modelsContext = buildingContext.getBootstrapContext().getModelsContext(); final JoinColumnOrFormula[] annotations = property.getRepeatedAnnotationUsages( HibernateAnnotations.JOIN_COLUMN_OR_FORMULA, - sourceModelContext + modelsContext ); if ( isNotEmpty( annotations ) ) { return annotations; @@ -252,11 +252,11 @@ private JoinColumnOrFormula[] joinColumnOrFormulaAnnotations(MemberDetails prope } private JoinColumn[] getJoinColumnAnnotations(MemberDetails property, PropertyData inferredData) { - final SourceModelBuildingContext sourceModelContext = buildingContext.getMetadataCollector().getSourceModelBuildingContext(); + final SourceModelBuildingContext modelsContext = buildingContext.getBootstrapContext().getModelsContext(); final JoinColumn[] joinColumns = property.getRepeatedAnnotationUsages( JpaAnnotations.JOIN_COLUMN, - sourceModelContext + modelsContext ); if ( isNotEmpty( joinColumns ) ) { return joinColumns; @@ -269,13 +269,13 @@ private JoinColumn[] getJoinColumnAnnotations(MemberDetails property, PropertyDa // spec-compliant to map the association with @PrimaryKeyJoinColumn) final PrimaryKeyJoinColumn[] primaryKeyJoinColumns = property.getRepeatedAnnotationUsages( JpaAnnotations.PRIMARY_KEY_JOIN_COLUMN, - sourceModelContext + modelsContext ); if ( isNotEmpty( primaryKeyJoinColumns ) ) { final JoinColumn[] adapters = new JoinColumn[primaryKeyJoinColumns.length]; for ( int i = 0; i < primaryKeyJoinColumns.length; i++ ) { final PrimaryKeyJoinColumn primaryKeyJoinColumn = primaryKeyJoinColumns[i]; - adapters[i] = JoinColumnJpaAnnotation.toJoinColumn( primaryKeyJoinColumn, sourceModelContext ); + adapters[i] = JoinColumnJpaAnnotation.toJoinColumn( primaryKeyJoinColumn, modelsContext ); } return adapters; } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/DialectOverridesAnnotationHelper.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/DialectOverridesAnnotationHelper.java index 1e1ba19cc67e..6477b8f1a987 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/DialectOverridesAnnotationHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/DialectOverridesAnnotationHelper.java @@ -77,14 +77,14 @@ public static T getOverridableAnnotation( AnnotationTarget element, Class annotationType, MetadataBuildingContext context) { - final SourceModelBuildingContext sourceModelContext = context.getMetadataCollector().getSourceModelBuildingContext(); + final SourceModelBuildingContext modelsContext = context.getBootstrapContext().getModelsContext(); final Class overrideAnnotation = OVERRIDE_MAP.get( annotationType ); if ( overrideAnnotation != null ) { // the requested annotation does have a DialectOverride variant - look for matching one of those... final Dialect dialect = context.getMetadataCollector().getDatabase().getDialect(); - final Annotation[] overrides = element.getRepeatedAnnotationUsages( overrideAnnotation, sourceModelContext ); + final Annotation[] overrides = element.getRepeatedAnnotationUsages( overrideAnnotation, modelsContext ); if ( isNotEmpty( overrides ) ) { for ( int i = 0; i < overrides.length; i++ ) { //noinspection unchecked @@ -97,7 +97,7 @@ public static T getOverridableAnnotation( } // no override was found. return the base annotation (if one) - return element.getAnnotationUsage( annotationType, sourceModelContext ); + return element.getAnnotationUsage( annotationType, modelsContext ); } public static boolean overrideMatchesDialect(DialectOverrider override, Dialect dialect) { diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EmbeddableBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EmbeddableBinder.java index b2c8c52534af..924269170848 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EmbeddableBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EmbeddableBinder.java @@ -317,9 +317,9 @@ static Component bindEmbeddable( } private static void callTypeBinders(Component component, MetadataBuildingContext context, TypeDetails annotatedClass ) { - final SourceModelBuildingContext sourceModelContext = context.getMetadataCollector().getSourceModelBuildingContext(); + final SourceModelBuildingContext modelsContext = context.getBootstrapContext().getModelsContext(); - final List metaAnnotatedAnnotations = annotatedClass.determineRawClass().getMetaAnnotated( TypeBinderType.class, sourceModelContext ); + final List metaAnnotatedAnnotations = annotatedClass.determineRawClass().getMetaAnnotated( TypeBinderType.class, modelsContext ); if ( isEmpty( metaAnnotatedAnnotations ) ) { return; } @@ -477,7 +477,7 @@ static Component fillEmbeddable( else { compositeUserType = compositeUserType( compositeUserTypeClass, context ); component.setTypeName( compositeUserTypeClass.getName() ); - returnedClassOrElement = context.getMetadataCollector().getSourceModelBuildingContext().getClassDetailsRegistry().resolveClassDetails( compositeUserType.embeddable().getName() ); + returnedClassOrElement = context.getBootstrapContext().getModelsContext().getClassDetailsRegistry().resolveClassDetails( compositeUserType.embeddable().getName() ); } AggregateComponentBinder.processAggregate( component, diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java index cc833a68eb52..94b443a17a63 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java @@ -27,39 +27,7 @@ import org.hibernate.AnnotationException; import org.hibernate.AssertionFailure; import org.hibernate.MappingException; -import org.hibernate.annotations.Cache; -import org.hibernate.annotations.CacheConcurrencyStrategy; -import org.hibernate.annotations.CacheLayout; -import org.hibernate.annotations.Check; -import org.hibernate.annotations.Checks; -import org.hibernate.annotations.ConcreteProxy; -import org.hibernate.annotations.DiscriminatorFormula; -import org.hibernate.annotations.DynamicInsert; -import org.hibernate.annotations.DynamicUpdate; -import org.hibernate.annotations.Filter; -import org.hibernate.annotations.Filters; -import org.hibernate.annotations.HQLSelect; -import org.hibernate.annotations.Immutable; -import org.hibernate.annotations.Mutability; -import org.hibernate.annotations.NaturalIdCache; -import org.hibernate.annotations.OnDelete; -import org.hibernate.annotations.OptimisticLockType; -import org.hibernate.annotations.OptimisticLocking; -import org.hibernate.annotations.QueryCacheLayout; -import org.hibernate.annotations.RowId; -import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.SQLDeleteAll; -import org.hibernate.annotations.SQLInsert; -import org.hibernate.annotations.SQLRestriction; -import org.hibernate.annotations.SQLSelect; -import org.hibernate.annotations.SQLUpdate; -import org.hibernate.annotations.SecondaryRow; -import org.hibernate.annotations.SecondaryRows; -import org.hibernate.annotations.SoftDelete; -import org.hibernate.annotations.Subselect; -import org.hibernate.annotations.Synchronize; -import org.hibernate.annotations.TypeBinderType; -import org.hibernate.annotations.View; +import org.hibernate.annotations.*; import org.hibernate.binder.TypeBinder; import org.hibernate.boot.model.NamedEntityGraphDefinition; import org.hibernate.boot.model.internal.InheritanceState.ElementsToProcess; @@ -198,8 +166,8 @@ public class EntityBinder { private String naturalIdCacheRegion; private CacheLayout queryCacheLayout; - private SourceModelBuildingContext getSourceModelContext() { - return getMetadataCollector().getSourceModelBuildingContext(); + private SourceModelBuildingContext modelsContext() { + return context.getBootstrapContext().getModelsContext(); } private InFlightMetadataCollector getMetadataCollector() { @@ -218,13 +186,14 @@ public static void bindEntityClass( } final InFlightMetadataCollector collector = context.getMetadataCollector(); + final SourceModelBuildingContext modelsContext = context.getBootstrapContext().getModelsContext(); //TODO: be more strict with secondary table allowance (not for ids, not for secondary table join columns etc) final InheritanceState inheritanceState = inheritanceStates.get( clazzToProcess ); final PersistentClass superEntity = getSuperEntity( clazzToProcess, inheritanceStates, context, inheritanceState ); final PersistentClass persistentClass = makePersistentClass( inheritanceState, superEntity, context ); - checkOverrides( clazzToProcess, superEntity, collector.getSourceModelBuildingContext() ); + checkOverrides( clazzToProcess, superEntity, modelsContext ); final EntityBinder entityBinder = new EntityBinder( clazzToProcess, persistentClass, context ); entityBinder.bindEntity(); @@ -321,17 +290,17 @@ private static void bindSoftDelete( } private static SoftDelete extractSoftDelete(ClassDetails classDetails, MetadataBuildingContext context) { - final SourceModelBuildingContext sourceModelContext = context.getMetadataCollector().getSourceModelBuildingContext(); - final SoftDelete fromClass = classDetails.getAnnotationUsage( SoftDelete.class, sourceModelContext ); + final SourceModelBuildingContext modelsContext = context.getBootstrapContext().getModelsContext(); + final SoftDelete fromClass = classDetails.getAnnotationUsage( SoftDelete.class, modelsContext ); if ( fromClass != null ) { return fromClass; } ClassDetails classToCheck = classDetails.getSuperClass(); while ( classToCheck != null ) { - final SoftDelete fromSuper = classToCheck.getAnnotationUsage( SoftDelete.class, sourceModelContext ); + final SoftDelete fromSuper = classToCheck.getAnnotationUsage( SoftDelete.class, modelsContext ); if ( fromSuper != null - && classToCheck.hasAnnotationUsage( jakarta.persistence.MappedSuperclass.class, sourceModelContext ) ) { + && classToCheck.hasAnnotationUsage( jakarta.persistence.MappedSuperclass.class, modelsContext ) ) { return fromSuper; } @@ -342,9 +311,9 @@ private static SoftDelete extractSoftDelete(ClassDetails classDetails, MetadataB } private void handleCheckConstraints() { - if ( annotatedClass.hasAnnotationUsage( Checks.class, getSourceModelContext() ) ) { + if ( annotatedClass.hasAnnotationUsage( Checks.class, modelsContext() ) ) { // if we have more than one of them they are not overrideable - final Checks explicitUsage = annotatedClass.getAnnotationUsage( Checks.class, getSourceModelContext() ); + final Checks explicitUsage = annotatedClass.getAnnotationUsage( Checks.class, modelsContext() ); for ( Check check : explicitUsage.value() ) { addCheckToEntity( check ); } @@ -371,7 +340,7 @@ private void addCheckToEntity(Check check) { private void callTypeBinders(PersistentClass persistentClass) { final List metaAnnotatedList = - annotatedClass.getMetaAnnotated( TypeBinderType.class, getSourceModelContext() ); + annotatedClass.getMetaAnnotated( TypeBinderType.class, modelsContext() ); for ( Annotation metaAnnotated : metaAnnotatedList ) { applyTypeBinder( metaAnnotated, persistentClass ); } @@ -420,7 +389,7 @@ private void handleIdentifier( private void processComplementaryTableDefinitions() { final jakarta.persistence.Table jpaTableUsage = - annotatedClass.getAnnotationUsage( jakarta.persistence.Table.class, getSourceModelContext() ); + annotatedClass.getAnnotationUsage( jakarta.persistence.Table.class, modelsContext() ); if ( jpaTableUsage != null ) { final Table table = persistentClass.getTable(); TableBinder.addJpaIndexes( table, jpaTableUsage.indexes(), context ); @@ -432,7 +401,7 @@ private void processComplementaryTableDefinitions() { final InFlightMetadataCollector.EntityTableXref entityTableXref = getMetadataCollector().getEntityTableXref( persistentClass.getEntityName() ); - annotatedClass.forEachAnnotationUsage( jakarta.persistence.SecondaryTable.class, getSourceModelContext(), (usage) -> { + annotatedClass.forEachAnnotationUsage( jakarta.persistence.SecondaryTable.class, modelsContext(), (usage) -> { final Identifier secondaryTableLogicalName = toIdentifier( usage.name() ); final Table table = entityTableXref.resolveTable( secondaryTableLogicalName ); assert table != null; @@ -554,7 +523,7 @@ private boolean mapAsIdClass( private ClassDetails idClassDetails(InheritanceState inheritanceState, ClassDetails classWithIdClass) { final IdClass idClassAnn = classWithIdClass.getDirectAnnotationUsage( IdClass.class ); - final ClassDetailsRegistry classDetailsRegistry = getSourceModelContext().getClassDetailsRegistry(); + final ClassDetailsRegistry classDetailsRegistry = modelsContext().getClassDetailsRegistry(); if ( idClassAnn == null ) { try { // look for an Id class generated by Hibernate Processor as an inner class of static metamodel @@ -687,7 +656,7 @@ private boolean isIdClassPrimaryKeyOfAssociatedEntity( } else { final IdClass idClass = - associatedClassWithIdClass.getAnnotationUsage( IdClass.class, getSourceModelContext() ); + associatedClassWithIdClass.getAnnotationUsage( IdClass.class, modelsContext() ); return compositeClass.getName().equals( idClass.value().getName() ); } } @@ -747,7 +716,7 @@ private Component bindIdClass( } private void handleSecondaryTables() { - annotatedClass.forEachRepeatedAnnotationUsages( JpaAnnotations.SECONDARY_TABLE, getSourceModelContext(), + annotatedClass.forEachRepeatedAnnotationUsages( JpaAnnotations.SECONDARY_TABLE, modelsContext(), usage -> addSecondaryTable( usage, null, false ) ); } @@ -757,7 +726,7 @@ private void handleClassTable(InheritanceState inheritanceState, PersistentClass final String catalog; final UniqueConstraint[] uniqueConstraints; final jakarta.persistence.Table tableAnnotation = - annotatedClass.getAnnotationUsage( jakarta.persistence.Table.class, getSourceModelContext() ); + annotatedClass.getAnnotationUsage( jakarta.persistence.Table.class, modelsContext() ); if ( tableAnnotation != null ) { table = tableAnnotation.name(); schema = tableAnnotation.schema(); @@ -794,8 +763,8 @@ private void createTable( String table, String catalog, UniqueConstraint[] uniqueConstraints) { - final RowId rowId = annotatedClass.getAnnotationUsage( RowId.class, getSourceModelContext() ); - final View view = annotatedClass.getAnnotationUsage( View.class, getSourceModelContext() ); + final RowId rowId = annotatedClass.getAnnotationUsage( RowId.class, modelsContext() ); + final View view = annotatedClass.getAnnotationUsage( View.class, modelsContext() ); bindTable( schema, catalog, @@ -862,7 +831,7 @@ private void joinedInheritance(InheritanceState state, PersistentClass superEnti new DependantValue( context, joinedSubclass.getTable(), joinedSubclass.getIdentifier() ); joinedSubclass.setKey( key ); handleForeignKeys( annotatedClass, context, key ); - final OnDelete onDelete = annotatedClass.getAnnotationUsage( OnDelete.class, getSourceModelContext() ); + final OnDelete onDelete = annotatedClass.getAnnotationUsage( OnDelete.class, modelsContext() ); key.setOnDeleteAction( onDelete == null ? null : onDelete.action() ); //we are never in a second pass at that stage, so queue it final InFlightMetadataCollector metadataCollector = getMetadataCollector(); @@ -889,16 +858,16 @@ private void joinedInheritance(InheritanceState state, PersistentClass superEnti } private void checkNoJoinColumns(ClassDetails annotatedClass) { - if ( annotatedClass.hasAnnotationUsage( PrimaryKeyJoinColumns.class, getSourceModelContext() ) - || annotatedClass.hasAnnotationUsage( PrimaryKeyJoinColumn.class, getSourceModelContext() ) ) { + if ( annotatedClass.hasAnnotationUsage( PrimaryKeyJoinColumns.class, modelsContext() ) + || annotatedClass.hasAnnotationUsage( PrimaryKeyJoinColumn.class, modelsContext() ) ) { throw new AnnotationException( "Entity class '" + annotatedClass.getName() + "' may not specify a '@PrimaryKeyJoinColumn'" ); } } private void checkNoOnDelete(ClassDetails annotatedClass) { - if ( annotatedClass.hasAnnotationUsage( PrimaryKeyJoinColumns.class, getSourceModelContext() ) - || annotatedClass.hasAnnotationUsage( PrimaryKeyJoinColumn.class, getSourceModelContext() ) ) { + if ( annotatedClass.hasAnnotationUsage( PrimaryKeyJoinColumns.class, modelsContext() ) + || annotatedClass.hasAnnotationUsage( PrimaryKeyJoinColumn.class, modelsContext() ) ) { throw new AnnotationException( "Entity class '" + annotatedClass.getName() + "' may not be annotated '@OnDelete'" ); } } @@ -971,12 +940,12 @@ private void bindDiscriminatorColumnToRootPersistentClass( */ private AnnotatedDiscriminatorColumn processSingleTableDiscriminatorProperties(InheritanceState inheritanceState) { final DiscriminatorColumn discriminatorColumn = - annotatedClass.getAnnotationUsage( DiscriminatorColumn.class, getSourceModelContext() ); + annotatedClass.getAnnotationUsage( DiscriminatorColumn.class, modelsContext() ); final DiscriminatorFormula discriminatorFormula = getOverridableAnnotation( annotatedClass, DiscriminatorFormula.class, context ); if ( !inheritanceState.hasParents() - || annotatedClass.hasAnnotationUsage( Inheritance.class, getSourceModelContext() ) ) { + || annotatedClass.hasAnnotationUsage( Inheritance.class, modelsContext() ) ) { return buildDiscriminatorColumn( discriminatorColumn, discriminatorFormula, null, DEFAULT_DISCRIMINATOR_COLUMN_NAME, context ); } @@ -1000,15 +969,15 @@ private AnnotatedDiscriminatorColumn processSingleTableDiscriminatorProperties(I * and {@value AvailableSettings#IGNORE_EXPLICIT_DISCRIMINATOR_COLUMNS_FOR_JOINED_SUBCLASS}. */ private AnnotatedDiscriminatorColumn processJoinedDiscriminatorProperties(InheritanceState inheritanceState) { - if ( annotatedClass.hasAnnotationUsage( DiscriminatorFormula.class, getSourceModelContext() ) ) { + if ( annotatedClass.hasAnnotationUsage( DiscriminatorFormula.class, modelsContext() ) ) { throw new AnnotationException( "Entity class '" + annotatedClass.getName() + "' has 'JOINED' inheritance and is annotated '@DiscriminatorFormula'" ); } final DiscriminatorColumn discriminatorColumn = - annotatedClass.getAnnotationUsage( DiscriminatorColumn.class, getSourceModelContext() ); + annotatedClass.getAnnotationUsage( DiscriminatorColumn.class, modelsContext() ); if ( !inheritanceState.hasParents() - || annotatedClass.hasAnnotationUsage( Inheritance.class, getSourceModelContext() ) ) { + || annotatedClass.hasAnnotationUsage( Inheritance.class, modelsContext() ) ) { return useDiscriminatorColumnForJoined( discriminatorColumn ) ? buildDiscriminatorColumn( discriminatorColumn, null, null, DEFAULT_DISCRIMINATOR_COLUMN_NAME, context ) : null; @@ -1078,7 +1047,7 @@ private void processIdPropertiesIfNotAlready( final boolean subclassAndSingleTableStrategy = inheritanceState.getType() == SINGLE_TABLE && inheritanceState.hasParents(); - if ( !hasIdAnnotation && property.hasAnnotationUsage( GeneratedValue.class, getSourceModelContext() ) ) { + if ( !hasIdAnnotation && property.hasAnnotationUsage( GeneratedValue.class, modelsContext() ) ) { throw new AnnotationException( "Property '" + getPath( propertyHolder, propertyAnnotatedElement ) + "' is annotated '@GeneratedValue' but is not part of an identifier" ); } @@ -1150,11 +1119,9 @@ private static AnnotatedJoinColumns subclassJoinColumns( final AnnotatedJoinColumns joinColumns = new AnnotatedJoinColumns(); joinColumns.setBuildingContext( context ); - final SourceModelBuildingContext sourceModelContext = - context.getMetadataCollector().getSourceModelBuildingContext(); - + final SourceModelBuildingContext modelsContext = context.getBootstrapContext().getModelsContext(); final PrimaryKeyJoinColumns primaryKeyJoinColumns = - clazzToProcess.getAnnotationUsage( PrimaryKeyJoinColumns.class, sourceModelContext ); + clazzToProcess.getAnnotationUsage( PrimaryKeyJoinColumns.class, modelsContext ); if ( primaryKeyJoinColumns != null ) { final PrimaryKeyJoinColumn[] columns = primaryKeyJoinColumns.value(); if ( !ArrayHelper.isEmpty( columns ) ) { @@ -1170,7 +1137,7 @@ private static AnnotatedJoinColumns subclassJoinColumns( } else { final PrimaryKeyJoinColumn columnAnnotation = - clazzToProcess.getAnnotationUsage( PrimaryKeyJoinColumn.class, sourceModelContext ); + clazzToProcess.getAnnotationUsage( PrimaryKeyJoinColumn.class, modelsContext ); buildInheritanceJoinColumn( columnAnnotation, null, @@ -1182,7 +1149,7 @@ private static AnnotatedJoinColumns subclassJoinColumns( } else { buildInheritanceJoinColumn( - clazzToProcess.getAnnotationUsage( PrimaryKeyJoinColumn.class, sourceModelContext ), + clazzToProcess.getAnnotationUsage( PrimaryKeyJoinColumn.class, modelsContext ), null, superEntity.getIdentifier(), joinColumns, @@ -1248,33 +1215,33 @@ public boolean isPropertyDefinedInSuperHierarchy(String name) { private void bindRowManagement() { final DynamicInsert dynamicInsertAnn = - annotatedClass.getAnnotationUsage( DynamicInsert.class, getSourceModelContext() ); + annotatedClass.getAnnotationUsage( DynamicInsert.class, modelsContext() ); persistentClass.setDynamicInsert( dynamicInsertAnn != null ); final DynamicUpdate dynamicUpdateAnn = - annotatedClass.getAnnotationUsage( DynamicUpdate.class, getSourceModelContext() ); + annotatedClass.getAnnotationUsage( DynamicUpdate.class, modelsContext() ); persistentClass.setDynamicUpdate( dynamicUpdateAnn != null ); if ( persistentClass.useDynamicInsert() - && annotatedClass.hasAnnotationUsage( SQLInsert.class, getSourceModelContext() ) ) { + && annotatedClass.hasAnnotationUsage( SQLInsert.class, modelsContext() ) ) { throw new AnnotationException( "Entity '" + name + "' is annotated both '@DynamicInsert' and '@SQLInsert'" ); } if ( persistentClass.useDynamicUpdate() - && annotatedClass.hasAnnotationUsage( SQLUpdate.class, getSourceModelContext() ) ) { + && annotatedClass.hasAnnotationUsage( SQLUpdate.class, modelsContext() ) ) { throw new AnnotationException( "Entity '" + name + "' is annotated both '@DynamicUpdate' and '@SQLUpdate'" ); } } private void bindOptimisticLocking() { final OptimisticLocking optimisticLockingAnn = - annotatedClass.getAnnotationUsage( OptimisticLocking.class, getSourceModelContext() ); + annotatedClass.getAnnotationUsage( OptimisticLocking.class, modelsContext() ); persistentClass.setOptimisticLockStyle( fromLockType( optimisticLockingAnn == null ? OptimisticLockType.VERSION : optimisticLockingAnn.type() ) ); } private void bindEntityAnnotation() { - final Entity entity = annotatedClass.getAnnotationUsage( Entity.class, getSourceModelContext() ); + final Entity entity = annotatedClass.getAnnotationUsage( Entity.class, modelsContext() ); if ( entity == null ) { throw new AssertionFailure( "@Entity should never be missing" ); } @@ -1338,13 +1305,13 @@ private void checkSubclassEntity() { } private void ensureNoMutabilityPlan() { - if ( annotatedClass.hasAnnotationUsage( Mutability.class, getSourceModelContext() ) ) { + if ( annotatedClass.hasAnnotationUsage( Mutability.class, modelsContext() ) ) { throw new MappingException( "@Mutability is not allowed on entity" ); } } private boolean isMutable() { - return !annotatedClass.hasAnnotationUsage( Immutable.class, getSourceModelContext() ); + return !annotatedClass.hasAnnotationUsage( Immutable.class, modelsContext() ); } private void registerImportName() { @@ -1439,7 +1406,7 @@ private void bindCustomSql() { QueryBinder.bindNativeQuery( loaderName, sqlSelect, annotatedClass, context ); } - final HQLSelect hqlSelect = annotatedClass.getAnnotationUsage( HQLSelect.class, getSourceModelContext() ); + final HQLSelect hqlSelect = annotatedClass.getAnnotationUsage( HQLSelect.class, modelsContext() ); if ( hqlSelect != null ) { final String loaderName = persistentClass.getEntityName() + "$HQLSelect"; persistentClass.setLoaderName( loaderName ); @@ -1448,7 +1415,7 @@ private void bindCustomSql() { } private void bindSubselect() { - final Subselect subselect = annotatedClass.getAnnotationUsage( Subselect.class, getSourceModelContext() ); + final Subselect subselect = annotatedClass.getAnnotationUsage( Subselect.class, modelsContext() ); if ( subselect != null ) { this.subselect = subselect.value(); } @@ -1465,7 +1432,7 @@ private A resolveCustomSqlAnnotation( // - if not, we return the normal SQLInsert (if one) final Class overrideAnnotation = getOverrideAnnotation( annotationType ); final Annotation[] dialectOverrides = - annotatedClass.getRepeatedAnnotationUsages( overrideAnnotation, getSourceModelContext() ); + annotatedClass.getRepeatedAnnotationUsages( overrideAnnotation, modelsContext() ); if ( isNotEmpty( dialectOverrides ) ) { final Dialect dialect = getMetadataCollector().getDatabase().getDialect(); for ( int i = 0; i < dialectOverrides.length; i++ ) { @@ -1487,7 +1454,7 @@ else if ( isNotBlank( tableName ) } } - return annotatedClass.getNamedAnnotationUsage( annotationType, tableName, "table", getSourceModelContext() ); + return annotatedClass.getNamedAnnotationUsage( annotationType, tableName, "table", modelsContext() ); } private void bindFilters() { @@ -1523,7 +1490,7 @@ private String getDefaultFilterCondition(String filterName) { } private void bindSynchronize() { - final Synchronize synchronize = annotatedClass.getAnnotationUsage( Synchronize.class, getSourceModelContext() ); + final Synchronize synchronize = annotatedClass.getAnnotationUsage( Synchronize.class, modelsContext() ); if ( synchronize != null ) { final JdbcEnvironment jdbcEnvironment = getMetadataCollector().getDatabase().getJdbcEnvironment(); final boolean logical = synchronize.logical(); @@ -1547,7 +1514,7 @@ public PersistentClass getPersistentClass() { } private void processNamedEntityGraphs() { - annotatedClass.forEachAnnotationUsage( NamedEntityGraph.class, getSourceModelContext(), this::processNamedEntityGraph ); + annotatedClass.forEachAnnotationUsage( NamedEntityGraph.class, modelsContext(), this::processNamedEntityGraph ); processParsedNamedGraphs(); } @@ -1555,7 +1522,7 @@ private void processNamedEntityGraphs() { private void processParsedNamedGraphs() { annotatedClass.forEachRepeatedAnnotationUsages( HibernateAnnotations.NAMED_ENTITY_GRAPH, - getSourceModelContext(), + modelsContext(), this::processParsedNamedEntityGraph ); } @@ -1576,7 +1543,7 @@ private void processParsedNamedEntityGraph(org.hibernate.annotations.NamedEntity private void bindDiscriminatorValue() { final DiscriminatorValue discriminatorValueAnn = - annotatedClass.getAnnotationUsage( DiscriminatorValue.class, getSourceModelContext() ); + annotatedClass.getAnnotationUsage( DiscriminatorValue.class, modelsContext() ); if ( discriminatorValueAnn == null ) { final Value discriminator = persistentClass.getDiscriminator(); if ( discriminator == null ) { @@ -1609,7 +1576,7 @@ private void bindProxy() { private void bindConcreteProxy() { final ConcreteProxy annotationUsage = - annotatedClass.getAnnotationUsage( ConcreteProxy.class, getSourceModelContext() ); + annotatedClass.getAnnotationUsage( ConcreteProxy.class, modelsContext() ); if ( annotationUsage != null ) { if ( persistentClass.getSuperclass() != null ) { throw new AnnotationException( "Entity class '" + persistentClass.getClassName() @@ -1627,14 +1594,14 @@ private void bindWhere() { } private static SQLRestriction extractSQLRestriction(ClassDetails classDetails, MetadataBuildingContext context) { - final SourceModelBuildingContext sourceModelContext = context.getMetadataCollector().getSourceModelBuildingContext(); + final SourceModelBuildingContext modelsContext = context.getBootstrapContext().getModelsContext(); final SQLRestriction fromClass = getOverridableAnnotation( classDetails, SQLRestriction.class, context ); if ( fromClass != null ) { return fromClass; } ClassDetails classToCheck = classDetails.getSuperClass(); while ( classToCheck != null - && classToCheck.hasAnnotationUsage( jakarta.persistence.MappedSuperclass.class, sourceModelContext ) ) { + && classToCheck.hasAnnotationUsage( jakarta.persistence.MappedSuperclass.class, modelsContext ) ) { final SQLRestriction fromSuper = getOverridableAnnotation( classToCheck, SQLRestriction.class, context ); if ( fromSuper != null ) { return fromSuper; @@ -1646,12 +1613,12 @@ private static SQLRestriction extractSQLRestriction(ClassDetails classDetails, M private void bindNaturalIdCache() { final NaturalIdCache naturalIdCacheAnn = - annotatedClass.getAnnotationUsage( NaturalIdCache.class, getSourceModelContext() ); + annotatedClass.getAnnotationUsage( NaturalIdCache.class, modelsContext() ); if ( naturalIdCacheAnn != null ) { final String region = naturalIdCacheAnn.region(); if ( region.isBlank() ) { final Cache explicitCacheAnn = - annotatedClass.getAnnotationUsage( Cache.class, getSourceModelContext() ); + annotatedClass.getAnnotationUsage( Cache.class, modelsContext() ); naturalIdCacheRegion = explicitCacheAnn != null && isNotBlank( explicitCacheAnn.region() ) ? explicitCacheAnn.region() + NATURAL_ID_CACHE_SUFFIX @@ -1681,7 +1648,7 @@ private void bindCache() { } private void bindSubclassCache() { - if ( annotatedClass.hasAnnotationUsage( Cache.class, getSourceModelContext() ) ) { + if ( annotatedClass.hasAnnotationUsage( Cache.class, modelsContext() ) ) { final String className = persistentClass.getClassName() == null ? annotatedClass.getName() : persistentClass.getClassName(); @@ -1690,7 +1657,7 @@ private void bindSubclassCache() { +" (only root classes may define second-level caching semantics)"); } - final Cacheable cacheable = annotatedClass.getAnnotationUsage( Cacheable.class, getSourceModelContext() ); + final Cacheable cacheable = annotatedClass.getAnnotationUsage( Cacheable.class, modelsContext() ); isCached = cacheable == null && persistentClass.getSuperclass() != null // we should inherit the root class caching config ? persistentClass.getSuperclass().isCached() @@ -1700,7 +1667,7 @@ private void bindSubclassCache() { } private void bindRootClassCache() { - final SourceModelBuildingContext sourceModelContext = getSourceModelContext(); + final SourceModelBuildingContext sourceModelContext = modelsContext(); final Cache cache = annotatedClass.getAnnotationUsage( Cache.class, sourceModelContext ); final Cacheable cacheable = annotatedClass.getAnnotationUsage( Cacheable.class, sourceModelContext ); @@ -1738,7 +1705,7 @@ private boolean isCacheable(Cacheable explicitCacheableAnn) { private Cache buildCacheMock(ClassDetails classDetails) { final CacheAnnotation cacheUsage = - HibernateAnnotations.CACHE.createUsage( getSourceModelContext() ); + HibernateAnnotations.CACHE.createUsage( modelsContext() ); cacheUsage.region( classDetails.getName() ); cacheUsage.usage( determineCacheConcurrencyStrategy() ); return cacheUsage; @@ -2267,7 +2234,7 @@ public AccessType getPropertyAccessor(AnnotationTarget element) { private AccessType getExplicitAccessType(AnnotationTarget element) { if ( element != null ) { - final Access access = element.getAnnotationUsage( Access.class, getSourceModelContext() ); + final Access access = element.getAnnotationUsage( Access.class, modelsContext() ); if ( access != null ) { return AccessType.getAccessStrategy( access.value() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/FilterDefBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/FilterDefBinder.java index 15a7914268a1..8dcd979304e6 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/FilterDefBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/FilterDefBinder.java @@ -41,8 +41,8 @@ public class FilterDefBinder { private static final CoreMessageLogger LOG = messageLogger( FilterDefBinder.class ); public static void bindFilterDefs(AnnotationTarget annotatedElement, MetadataBuildingContext context) { - final SourceModelBuildingContext sourceModelContext = context.getMetadataCollector().getSourceModelBuildingContext(); - annotatedElement.forEachAnnotationUsage( FilterDef.class, sourceModelContext, (usage) -> { + final SourceModelBuildingContext modelsContext = context.getBootstrapContext().getModelsContext(); + annotatedElement.forEachAnnotationUsage( FilterDef.class, modelsContext, (usage) -> { bindFilterDef( usage, context ); } ); } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/GeneratorAnnotationHelper.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/GeneratorAnnotationHelper.java index 2f46c95a65a3..2fb32f1a3c82 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/GeneratorAnnotationHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/GeneratorAnnotationHelper.java @@ -4,15 +4,8 @@ */ package org.hibernate.boot.model.internal; -import java.lang.annotation.Annotation; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Properties; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; - +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.TableGenerator; import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.IdGeneratorType; @@ -41,8 +34,14 @@ import org.hibernate.models.spi.SourceModelBuildingContext; import org.hibernate.models.spi.SourceModelContext; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.TableGenerator; +import java.lang.annotation.Annotation; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Properties; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; import static org.hibernate.boot.model.internal.GeneratorBinder.beanContainer; import static org.hibernate.boot.model.internal.GeneratorBinder.instantiateGenerator; @@ -66,14 +65,13 @@ public static A findLocalizedMatch( @Nullable Function nameExtractor, @Nullable String matchName, MetadataBuildingContext context) { - final SourceModelBuildingContext sourceModelContext = - context.getMetadataCollector().getSourceModelBuildingContext(); + final SourceModelBuildingContext modelsContext = context.getBootstrapContext().getModelsContext(); A possibleMatch = null; // first we look on the member for ( A generatorAnnotation: - idMember.getRepeatedAnnotationUsages( generatorAnnotationType, sourceModelContext ) ) { + idMember.getRepeatedAnnotationUsages( generatorAnnotationType, modelsContext ) ) { if ( nameExtractor != null ) { final String registrationName = nameExtractor.apply( generatorAnnotation ); if ( registrationName.isEmpty() ) { @@ -92,7 +90,7 @@ public static A findLocalizedMatch( // next, on the entity class for ( A generatorAnnotation : - entityType.getRepeatedAnnotationUsages( generatorAnnotationType, sourceModelContext ) ) { + entityType.getRepeatedAnnotationUsages( generatorAnnotationType, modelsContext ) ) { if ( nameExtractor != null ) { final String registrationName = nameExtractor.apply( generatorAnnotation ); if ( registrationName.isEmpty() ) { @@ -111,7 +109,7 @@ else if ( registrationName.equals( matchName ) ) { // next, on the declaring class for ( A generatorAnnotation: - idMember.getDeclaringType().getRepeatedAnnotationUsages( generatorAnnotationType, sourceModelContext ) ) { + idMember.getDeclaringType().getRepeatedAnnotationUsages( generatorAnnotationType, modelsContext ) ) { if ( nameExtractor != null ) { final String registrationName = nameExtractor.apply( generatorAnnotation ); if ( registrationName.isEmpty() ) { @@ -132,7 +130,7 @@ else if ( registrationName.equals( matchName ) ) { final ClassDetails packageInfo = locatePackageInfoDetails( idMember.getDeclaringType(), context ); if ( packageInfo != null ) { for ( A generatorAnnotation: - packageInfo.getRepeatedAnnotationUsages( generatorAnnotationType, sourceModelContext ) ) { + packageInfo.getRepeatedAnnotationUsages( generatorAnnotationType, modelsContext ) ) { if ( nameExtractor != null ) { final String registrationName = nameExtractor.apply( generatorAnnotation ); if ( registrationName.isEmpty() ) { @@ -154,7 +152,8 @@ else if ( registrationName.equals( matchName ) ) { } public static ClassDetails locatePackageInfoDetails(ClassDetails classDetails, MetadataBuildingContext buildingContext) { - return locatePackageInfoDetails( classDetails, buildingContext.getMetadataCollector().getSourceModelBuildingContext() ); + final SourceModelBuildingContext modelsContext = buildingContext.getBootstrapContext().getModelsContext(); + return locatePackageInfoDetails( classDetails, modelsContext ); } public static ClassDetails locatePackageInfoDetails(ClassDetails classDetails, SourceModelContext modelContext) { diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/GeneratorBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/GeneratorBinder.java index aa9660e1eb1f..7fc34e46f657 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/GeneratorBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/GeneratorBinder.java @@ -4,17 +4,11 @@ */ package org.hibernate.boot.model.internal; -import java.lang.annotation.Annotation; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Member; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Properties; -import java.util.function.BiConsumer; -import java.util.function.Consumer; - +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.TableGenerator; +import jakarta.persistence.Version; import org.hibernate.AnnotationException; import org.hibernate.AssertionFailure; import org.hibernate.MappingException; @@ -53,11 +47,16 @@ import org.hibernate.resource.beans.container.spi.BeanContainer; import org.hibernate.resource.beans.internal.Helper; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.TableGenerator; -import jakarta.persistence.Version; +import java.lang.annotation.Annotation; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Member; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Properties; +import java.util.function.BiConsumer; +import java.util.function.Consumer; import static jakarta.persistence.GenerationType.AUTO; import static java.util.Collections.emptyMap; @@ -265,17 +264,16 @@ private static GenerationType interpretGenerationType(GeneratedValue generatedVa public static void visitIdGeneratorDefinitions( AnnotationTarget annotatedElement, Consumer consumer, - MetadataBuildingContext context) { - final SourceModelBuildingContext sourceModelContext = - context.getMetadataCollector().getSourceModelBuildingContext(); + MetadataBuildingContext buildingContext) { + final SourceModelBuildingContext modelsContext = buildingContext.getBootstrapContext().getModelsContext(); - annotatedElement.forEachAnnotationUsage( TableGenerator.class, sourceModelContext, + annotatedElement.forEachAnnotationUsage( TableGenerator.class, modelsContext, usage -> consumer.accept( buildTableIdGenerator( usage ) ) ); - annotatedElement.forEachAnnotationUsage( SequenceGenerator.class, sourceModelContext, + annotatedElement.forEachAnnotationUsage( SequenceGenerator.class, modelsContext, usage -> consumer.accept( buildSequenceIdGenerator( usage ) ) ); - annotatedElement.forEachAnnotationUsage( GenericGenerator.class, sourceModelContext, + annotatedElement.forEachAnnotationUsage( GenericGenerator.class, modelsContext, usage -> consumer.accept( buildIdGenerator( usage ) ) ); } @@ -800,15 +798,13 @@ static void createIdGeneratorsFromGeneratorAnnotations( PropertyHolder propertyHolder, PropertyData inferredData, SimpleValue idValue, - MetadataBuildingContext context) { - - final SourceModelBuildingContext sourceModelContext = - context.getMetadataCollector().getSourceModelBuildingContext(); + MetadataBuildingContext buildingContext) { + final SourceModelBuildingContext modelsContext = buildingContext.getBootstrapContext().getModelsContext(); final MemberDetails idAttributeMember = inferredData.getAttributeMember(); final List idGeneratorAnnotations = - idAttributeMember.getMetaAnnotated( IdGeneratorType.class, sourceModelContext ); + idAttributeMember.getMetaAnnotated( IdGeneratorType.class, modelsContext ); final List generatorAnnotations = - idAttributeMember.getMetaAnnotated( ValueGenerationType.class, sourceModelContext ); + idAttributeMember.getMetaAnnotated( ValueGenerationType.class, modelsContext ); // Since these collections may contain Proxies created by common-annotations module we cannot reliably use simple remove/removeAll // collection methods as those proxies do not implement hashcode/equals and even a simple `a.equals(a)` will return `false`. // Instead, we will check the annotation types, since generator annotations should not be "repeatable" we should have only @@ -830,7 +826,7 @@ static void createIdGeneratorsFromGeneratorAnnotations( idAttributeMember, idGeneratorAnnotations.get(0), idValue, - beanContainer( context ) + beanContainer( buildingContext ) ) ); } else if ( !generatorAnnotations.isEmpty() ) { @@ -843,7 +839,7 @@ else if ( !generatorAnnotations.isEmpty() ) { ) ); } else if ( idAttributeMember.hasDirectAnnotationUsage( GeneratedValue.class ) ) { - createIdGenerator( idAttributeMember, idValue, propertyHolder.getPersistentClass(), context ); + createIdGenerator( idAttributeMember, idValue, propertyHolder.getPersistentClass(), buildingContext ); } } @@ -853,13 +849,13 @@ else if ( idAttributeMember.hasDirectAnnotationUsage( GeneratedValue.class ) ) { */ static GeneratorCreator createValueGeneratorFromAnnotations( PropertyHolder holder, String propertyName, - Value value, MemberDetails property, MetadataBuildingContext context) { + Value value, MemberDetails property, MetadataBuildingContext buildingContext) { + final SourceModelBuildingContext modelsContext = buildingContext.getBootstrapContext().getModelsContext(); final List generatorAnnotations = - property.getMetaAnnotated( ValueGenerationType.class, - context.getMetadataCollector().getSourceModelBuildingContext() ); + property.getMetaAnnotated( ValueGenerationType.class, modelsContext ); return switch ( generatorAnnotations.size() ) { case 0 -> null; - case 1 -> generatorCreator( property, value, generatorAnnotations.get(0), beanContainer( context ) ); + case 1 -> generatorCreator( property, value, generatorAnnotations.get(0), beanContainer( buildingContext ) ); default -> throw new AnnotationException( "Property '" + qualify( holder.getPath(), propertyName ) + "' has too many generator annotations: " + generatorAnnotations ); }; diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/IdBagIdGeneratorResolverSecondPass.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/IdBagIdGeneratorResolverSecondPass.java index 32052cf9395f..3a560330f9ec 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/IdBagIdGeneratorResolverSecondPass.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/IdBagIdGeneratorResolverSecondPass.java @@ -140,7 +140,7 @@ private void handleTableStrategy( handleTableGenerator( generatorName, - new TableGeneratorJpaAnnotation( metadataCollector.getSourceModelBuildingContext() ), + new TableGeneratorJpaAnnotation( buildingContext.getBootstrapContext().getModelsContext() ), idValue, idBagMember, buildingContext @@ -185,7 +185,7 @@ private void handleSequenceStrategy( handleSequenceGenerator( generatorName, - new SequenceGeneratorJpaAnnotation( metadataCollector.getSourceModelBuildingContext() ), + new SequenceGeneratorJpaAnnotation( buildingContext.getBootstrapContext().getModelsContext() ), idValue, idBagMember, buildingContext diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/MapBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/MapBinder.java index efd8b5005533..a4da8c7f1d2b 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/MapBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/MapBinder.java @@ -243,9 +243,12 @@ private AnnotatedClassType annotatedMapKeyType( } private ClassDetails mapKeyClass(String mapKeyType) { - return isPrimitive( mapKeyType ) ? null - : buildingContext.getMetadataCollector().getSourceModelBuildingContext() - .getClassDetailsRegistry().resolveClassDetails( mapKeyType ); + return isPrimitive( mapKeyType ) + ? null + : buildingContext.getBootstrapContext() + .getModelsContext() + .getClassDetailsRegistry() + .resolveClassDetails( mapKeyType ); } private static String getKeyType(MemberDetails property) { diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java index 978afd6a27e8..0fe819740425 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java @@ -4,13 +4,14 @@ */ package org.hibernate.boot.model.internal; -import java.lang.annotation.Annotation; -import java.util.Collection; -import java.util.EnumSet; -import java.util.List; -import java.util.Map; - +import jakarta.persistence.Basic; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.EmbeddedId; import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; import jakarta.persistence.MapKey; import jakarta.persistence.MapKeyClass; import jakarta.persistence.MapKeyColumn; @@ -18,8 +19,12 @@ import jakarta.persistence.MapKeyJoinColumn; import jakarta.persistence.MapKeyJoinColumns; import jakarta.persistence.MapKeyTemporal; +import jakarta.persistence.MapsId; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; import jakarta.persistence.OrderBy; import jakarta.persistence.OrderColumn; +import jakarta.persistence.Version; import org.hibernate.AnnotationException; import org.hibernate.AssertionFailure; import org.hibernate.MappingException; @@ -66,18 +71,11 @@ import org.hibernate.models.spi.TypeVariableScope; import org.hibernate.usertype.CompositeUserType; - -import jakarta.persistence.Basic; -import jakarta.persistence.ElementCollection; -import jakarta.persistence.EmbeddedId; -import jakarta.persistence.Id; -import jakarta.persistence.Lob; -import jakarta.persistence.ManyToMany; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.MapsId; -import jakarta.persistence.OneToMany; -import jakarta.persistence.OneToOne; -import jakarta.persistence.Version; +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.EnumSet; +import java.util.List; +import java.util.Map; import static jakarta.persistence.FetchType.LAZY; import static org.hibernate.boot.model.internal.AnyBinder.bindAny; @@ -132,7 +130,7 @@ public class PropertyBinder { private String referencedEntityName; // only used for @MapsId or @IdClass protected SourceModelBuildingContext getSourceModelContext() { - return buildingContext.getMetadataCollector().getSourceModelBuildingContext(); + return buildingContext.getBootstrapContext().getModelsContext(); } private void setReferencedEntityName(String referencedEntityName) { @@ -604,7 +602,7 @@ private static int addProperty( // and if so, skip it... for ( PropertyData propertyData : inFlightPropertyDataList ) { if ( propertyData.getPropertyName().equals( property.resolveAttributeName() ) ) { - checkIdProperty( property, propertyData, collector.getSourceModelBuildingContext() ); + checkIdProperty( property, propertyData, context.getBootstrapContext().getModelsContext() ); // EARLY EXIT!!! return idPropertyCounter; } @@ -1308,21 +1306,21 @@ private static boolean isLazy(MemberDetails property) { private static Class> resolveCompositeUserType( PropertyData inferredData, - MetadataBuildingContext context) { - final SourceModelBuildingContext sourceModelContext = - context.getMetadataCollector().getSourceModelBuildingContext(); + MetadataBuildingContext buildingContext) { + final SourceModelBuildingContext modelsContext = buildingContext.getBootstrapContext().getModelsContext(); + final MemberDetails attributeMember = inferredData.getAttributeMember(); final TypeDetails classOrElementType = inferredData.getClassOrElementType(); final ClassDetails returnedClass = classOrElementType.determineRawClass(); if ( attributeMember != null ) { final CompositeType compositeType = - attributeMember.locateAnnotationUsage( CompositeType.class, sourceModelContext ); + attributeMember.locateAnnotationUsage( CompositeType.class, modelsContext ); if ( compositeType != null ) { return compositeType.value(); } final Class> compositeUserType = - resolveTimeZoneStorageCompositeUserType( attributeMember, returnedClass, context ); + resolveTimeZoneStorageCompositeUserType( attributeMember, returnedClass, buildingContext ); if ( compositeUserType != null ) { return compositeUserType; } @@ -1331,7 +1329,7 @@ private static Class> resolveCompositeUserType( if ( returnedClass != null ) { final Class embeddableClass = returnedClass.toJavaClass(); if ( embeddableClass != null ) { - return context.getMetadataCollector().findRegisteredCompositeUserType( embeddableClass ); + return buildingContext.getMetadataCollector().findRegisteredCompositeUserType( embeddableClass ); } } @@ -1344,8 +1342,7 @@ private static PropertyData getPropertyOverriddenByMapperOrMapsId( String propertyName, MetadataBuildingContext buildingContext) { final ClassDetailsRegistry classDetailsRegistry = - buildingContext.getMetadataCollector().getSourceModelBuildingContext() - .getClassDetailsRegistry(); + buildingContext.getBootstrapContext().getModelsContext().getClassDetailsRegistry(); final PersistentClass persistentClass = propertyHolder.getPersistentClass(); final String name = StringHelper.isEmpty( persistentClass.getClassName() ) diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyInferredData.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyInferredData.java index 84b9586775fa..1120ec45fda8 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyInferredData.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyInferredData.java @@ -4,6 +4,7 @@ */ package org.hibernate.boot.model.internal; +import jakarta.persistence.Access; import org.hibernate.MappingException; import org.hibernate.annotations.Target; import org.hibernate.boot.models.internal.ModelsHelper; @@ -19,8 +20,6 @@ import org.hibernate.models.spi.TypeDetails; import org.hibernate.models.spi.TypeVariableScope; -import jakarta.persistence.Access; - /** * Retrieve all inferred data from an annotated element * @@ -81,14 +80,12 @@ public String getPropertyName() throws MappingException { @Override public TypeDetails getPropertyType() throws MappingException { final org.hibernate.boot.internal.Target targetAnnotation = propertyMember.getDirectAnnotationUsage( org.hibernate.boot.internal.Target.class ); - final SourceModelBuildingContext sourceModelContext = buildingContext.getMetadataCollector() - .getSourceModelBuildingContext(); + final SourceModelBuildingContext sourceModelContext = buildingContext.getBootstrapContext().getModelsContext(); if ( targetAnnotation != null ) { final String targetName = targetAnnotation.value(); - final SourceModelBuildingContext sourceModelBuildingContext = sourceModelContext; final ClassDetails classDetails = ModelsHelper.resolveClassDetails( targetName, - sourceModelBuildingContext.getClassDetailsRegistry(), + sourceModelContext.getClassDetailsRegistry(), () -> new DynamicClassDetails( targetName, sourceModelContext ) ); return new ClassTypeDetailsImpl( classDetails, TypeDetails.Kind.CLASS ); @@ -112,24 +109,21 @@ private static ClassTypeDetailsImpl resolveLegacyTargetAnnotation( @Override public TypeDetails getClassOrElementType() throws MappingException { - final SourceModelBuildingContext sourceModelBuildingContext = buildingContext - .getMetadataCollector() - .getSourceModelBuildingContext(); - + final SourceModelBuildingContext modelsContext = buildingContext.getBootstrapContext().getModelsContext(); final org.hibernate.boot.internal.Target annotationUsage = propertyMember.getDirectAnnotationUsage( org.hibernate.boot.internal.Target.class ); if ( annotationUsage != null ) { final String targetName = annotationUsage.value(); final ClassDetails classDetails = ModelsHelper.resolveClassDetails( targetName, - sourceModelBuildingContext.getClassDetailsRegistry(), - () -> new DynamicClassDetails( targetName, sourceModelBuildingContext ) + modelsContext.getClassDetailsRegistry(), + () -> new DynamicClassDetails( targetName, modelsContext ) ); return new ClassTypeDetailsImpl( classDetails, TypeDetails.Kind.CLASS ); } final Target legacyTargetAnnotation = propertyMember.getDirectAnnotationUsage( Target.class ); if ( legacyTargetAnnotation != null ) { - return resolveLegacyTargetAnnotation( legacyTargetAnnotation, sourceModelBuildingContext ); + return resolveLegacyTargetAnnotation( legacyTargetAnnotation, modelsContext ); } return propertyMember.resolveRelativeAssociatedType( ownerType ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/QueryBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/QueryBinder.java index 5b2e5d5765db..79f1f5247d0a 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/QueryBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/QueryBinder.java @@ -4,17 +4,18 @@ */ package org.hibernate.boot.model.internal; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.function.Supplier; - +import jakarta.persistence.CacheRetrieveMode; +import jakarta.persistence.CacheStoreMode; +import jakarta.persistence.NamedNativeQuery; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.NamedStoredProcedureQuery; +import jakarta.persistence.ParameterMode; +import jakarta.persistence.QueryHint; +import jakarta.persistence.SqlResultSetMapping; +import jakarta.persistence.StoredProcedureParameter; import org.hibernate.AnnotationException; import org.hibernate.CacheMode; import org.hibernate.FlushMode; -import org.hibernate.models.spi.AnnotationTarget; -import org.hibernate.query.QueryFlushMode; import org.hibernate.LockOptions; import org.hibernate.annotations.FlushModeType; import org.hibernate.annotations.HQLSelect; @@ -34,21 +35,19 @@ import org.hibernate.internal.log.DeprecationLogger; import org.hibernate.jpa.HibernateHints; import org.hibernate.jpa.internal.util.FlushModeTypeHelper; +import org.hibernate.models.spi.AnnotationTarget; import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.SourceModelBuildingContext; +import org.hibernate.query.QueryFlushMode; import org.hibernate.query.sql.internal.ParameterParser; import org.hibernate.query.sql.spi.ParameterRecognizer; import org.hibernate.type.BasicType; -import jakarta.persistence.CacheRetrieveMode; -import jakarta.persistence.CacheStoreMode; -import jakarta.persistence.NamedNativeQuery; -import jakarta.persistence.NamedQuery; -import jakarta.persistence.NamedStoredProcedureQuery; -import jakarta.persistence.ParameterMode; -import jakarta.persistence.QueryHint; -import jakarta.persistence.SqlResultSetMapping; -import jakarta.persistence.StoredProcedureParameter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.function.Supplier; import static java.lang.Boolean.TRUE; import static org.hibernate.internal.CoreLogging.messageLogger; @@ -297,10 +296,9 @@ public static NamedProcedureCallDefinition createStoredProcedure( } final JdbcCall jdbcCall = parseJdbcCall( sqlString, exceptionProducer ); - final SourceModelBuildingContext sourceModelBuildingContext = context.getMetadataCollector() - .getSourceModelBuildingContext(); + final SourceModelBuildingContext modelsContext = context.getBootstrapContext().getModelsContext(); final NamedStoredProcedureQueryJpaAnnotation nameStoredProcedureQueryAnn = - JpaAnnotations.NAMED_STORED_PROCEDURE_QUERY.createUsage( sourceModelBuildingContext ); + JpaAnnotations.NAMED_STORED_PROCEDURE_QUERY.createUsage( modelsContext ); nameStoredProcedureQueryAnn.name( builder.getName() ); nameStoredProcedureQueryAnn.procedureName( jdbcCall.callableName ); @@ -309,7 +307,7 @@ public static NamedProcedureCallDefinition createStoredProcedure( for ( int i = 0; i < jdbcCall.parameters.size(); i++ ) { final StoredProcedureParameterJpaAnnotation param = - JpaAnnotations.STORED_PROCEDURE_PARAMETER.createUsage( sourceModelBuildingContext ); + JpaAnnotations.STORED_PROCEDURE_PARAMETER.createUsage( modelsContext ); parameters[i] = param; final String paramName = jdbcCall.parameters.get( i ); @@ -345,7 +343,7 @@ public static NamedProcedureCallDefinition createStoredProcedure( if ( builder.getQuerySpaces() != null ) { final QueryHintJpaAnnotation hint = - JpaAnnotations.QUERY_HINT.createUsage( sourceModelBuildingContext ); + JpaAnnotations.QUERY_HINT.createUsage( modelsContext ); hint.name( HibernateHints.HINT_NATIVE_SPACES ); hint.value( String.join( " ", builder.getQuerySpaces() ) ); hints.add( hint ); @@ -354,7 +352,7 @@ public static NamedProcedureCallDefinition createStoredProcedure( if ( jdbcCall.resultParameter ) { // Mark native queries that have a result parameter as callable functions final QueryHintJpaAnnotation hint = - JpaAnnotations.QUERY_HINT.createUsage( sourceModelBuildingContext ); + JpaAnnotations.QUERY_HINT.createUsage( modelsContext ); hint.name( HibernateHints.HINT_CALLABLE_FUNCTION ); hint.value( "true" ); hints.add( hint ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/StrictIdGeneratorResolverSecondPass.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/StrictIdGeneratorResolverSecondPass.java index e1148d919540..eb9588dbd688 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/StrictIdGeneratorResolverSecondPass.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/StrictIdGeneratorResolverSecondPass.java @@ -19,6 +19,7 @@ import org.hibernate.models.spi.MemberDetails; import jakarta.persistence.GeneratedValue; +import org.hibernate.models.spi.SourceModelBuildingContext; import static org.hibernate.boot.model.internal.GeneratorAnnotationHelper.handleGenericGenerator; import static org.hibernate.boot.model.internal.GeneratorAnnotationHelper.handleSequenceGenerator; @@ -50,6 +51,10 @@ public StrictIdGeneratorResolverSecondPass( super( entityMapping, idValue, idMember, generatedValue, buildingContext ); } + private SourceModelBuildingContext modelsContext() { + return buildingContext.getBootstrapContext().getModelsContext(); + } + @Override protected void handleUnnamedSequenceGenerator() { final InFlightMetadataCollector metadataCollector = buildingContext.getMetadataCollector(); @@ -71,7 +76,7 @@ protected void handleUnnamedSequenceGenerator() { handleSequenceGenerator( entityMapping.getJpaEntityName(), - new SequenceGeneratorJpaAnnotation( metadataCollector.getSourceModelBuildingContext() ), + new SequenceGeneratorJpaAnnotation( modelsContext() ), idValue, idMember, buildingContext @@ -98,7 +103,7 @@ protected void handleNamedSequenceGenerator() { handleSequenceGenerator( generatedValue.generator(), - new SequenceGeneratorJpaAnnotation( generatedValue.generator(), metadataCollector.getSourceModelBuildingContext() ), + new SequenceGeneratorJpaAnnotation( generatedValue.generator(), modelsContext() ), idValue, idMember, buildingContext @@ -125,7 +130,7 @@ protected void handleUnnamedTableGenerator() { handleTableGenerator( entityMapping.getJpaEntityName(), - new TableGeneratorJpaAnnotation( metadataCollector.getSourceModelBuildingContext() ), + new TableGeneratorJpaAnnotation( modelsContext() ), idValue, idMember, buildingContext @@ -153,7 +158,7 @@ protected void handleNamedTableGenerator() { handleTableGenerator( generatedValue.generator(), - new TableGeneratorJpaAnnotation( generatedValue.generator(), metadataCollector.getSourceModelBuildingContext() ), + new TableGeneratorJpaAnnotation( generatedValue.generator(), modelsContext() ), idValue, idMember, buildingContext @@ -236,7 +241,7 @@ private void handleAutoGenerator(String globalRegistrationName) { handleSequenceGenerator( globalRegistrationName, - new SequenceGeneratorJpaAnnotation( generatedValue.generator(), metadataCollector.getSourceModelBuildingContext() ), + new SequenceGeneratorJpaAnnotation( generatedValue.generator(), modelsContext() ), idValue, idMember, buildingContext diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ToOneBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ToOneBinder.java index 556c90da622e..e3f0ac207f58 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ToOneBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ToOneBinder.java @@ -335,8 +335,8 @@ private static void handleFetchProfileOverrides( PropertyData inferredData) { final MetadataBuildingContext context = toOne.getBuildingContext(); final InFlightMetadataCollector collector = context.getMetadataCollector(); - final SourceModelBuildingContext sourceModelContext = collector.getSourceModelBuildingContext(); - property.forEachAnnotationUsage( FetchProfileOverride.class, sourceModelContext, + final SourceModelBuildingContext modelsContext = context.getBootstrapContext().getModelsContext(); + property.forEachAnnotationUsage( FetchProfileOverride.class, modelsContext, usage -> collector.addSecondPass( new FetchSecondPass( usage, propertyHolder, inferredData.getPropertyName(), context ) )); } @@ -605,14 +605,14 @@ public static ClassDetails getTargetEntity(PropertyData propertyData, MetadataBu } private static ClassDetails getTargetEntityClass(MemberDetails property, MetadataBuildingContext context) { - final SourceModelBuildingContext sourceModelContext = context.getMetadataCollector().getSourceModelBuildingContext(); + final SourceModelBuildingContext modelsContext = context.getBootstrapContext().getModelsContext(); final ManyToOne manyToOne = property.getDirectAnnotationUsage( ManyToOne.class ); if ( manyToOne != null ) { - return sourceModelContext.getClassDetailsRegistry().resolveClassDetails( manyToOne.targetEntity().getName() ); + return modelsContext.getClassDetailsRegistry().resolveClassDetails( manyToOne.targetEntity().getName() ); } final OneToOne oneToOne = property.getDirectAnnotationUsage( OneToOne.class ); if ( oneToOne != null ) { - return sourceModelContext.getClassDetailsRegistry().resolveClassDetails( oneToOne.targetEntity().getName() ); + return modelsContext.getClassDetailsRegistry().resolveClassDetails( oneToOne.targetEntity().getName() ); } throw new AssertionFailure( "Unexpected discovery of a targetEntity: " + property.getName() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/process/spi/MetadataBuildingProcess.java b/hibernate-core/src/main/java/org/hibernate/boot/model/process/spi/MetadataBuildingProcess.java index 27fe921d0905..ae0d12f568a5 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/process/spi/MetadataBuildingProcess.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/process/spi/MetadataBuildingProcess.java @@ -373,7 +373,7 @@ public static DomainModelSource processManagedResources( // - allKnownClassNames (technically could be included in xmlPreProcessingResult) // - sourceModelBuildingContext - final SourceModelBuildingContext sourceModelBuildingContext = metadataCollector.getSourceModelBuildingContext(); + final SourceModelBuildingContext modelsContext = bootstrapContext.getModelsContext(); final XmlPreProcessingResult xmlPreProcessingResult = XmlPreProcessor.preProcessXmlResources( managedResources, metadataCollector.getPersistenceUnitMetadata() @@ -388,7 +388,7 @@ public static DomainModelSource processManagedResources( ); managedResources.getAnnotatedPackageNames().forEach( (packageName) -> { try { - final Class packageInfoClass = sourceModelBuildingContext.getClassLoading().classForName( packageName + ".package-info" ); + final Class packageInfoClass = modelsContext.getClassLoading().classForName( packageName + ".package-info" ); allKnownClassNames.add( packageInfoClass.getName() ); } catch (ClassLoadingException classLoadingException) { @@ -415,11 +415,11 @@ public static DomainModelSource processManagedResources( // JPA id generator global-ity thing final boolean areIdGeneratorsGlobal = true; - final ClassDetailsRegistry classDetailsRegistry = sourceModelBuildingContext.getClassDetailsRegistry(); + final ClassDetailsRegistry classDetailsRegistry = modelsContext.getClassDetailsRegistry(); final DomainModelCategorizationCollector modelCategorizationCollector = new DomainModelCategorizationCollector( areIdGeneratorsGlobal, metadataCollector.getGlobalRegistrations(), - sourceModelBuildingContext + modelsContext ); final RootMappingDefaults rootMappingDefaults = new RootMappingDefaults( @@ -429,7 +429,7 @@ public static DomainModelSource processManagedResources( final XmlProcessingResult xmlProcessingResult = XmlProcessor.processXml( xmlPreProcessingResult, modelCategorizationCollector, - sourceModelBuildingContext, + modelsContext, bootstrapContext, rootMappingDefaults ); @@ -559,7 +559,8 @@ public void contributeManagedClass(ClassDetails classDetails) { additionalClassDetails = new ArrayList<>(); } additionalClassDetails.add( classDetails ); - metadataCollector.getSourceModelBuildingContext() + rootMetadataBuildingContext.getBootstrapContext() + .getModelsContext() .getClassDetailsRegistry() .as( MutableClassDetailsRegistry.class ) .addClassDetails( classDetails.getName(), classDetails ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/spi/BootstrapContext.java b/hibernate-core/src/main/java/org/hibernate/boot/spi/BootstrapContext.java index f1bbe6d81deb..dc78d756c024 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/spi/BootstrapContext.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/spi/BootstrapContext.java @@ -20,6 +20,7 @@ import org.hibernate.engine.config.spi.ConfigurationService; import org.hibernate.jpa.spi.MutableJpaCompliance; import org.hibernate.metamodel.spi.ManagedTypeRepresentationResolver; +import org.hibernate.models.spi.SourceModelBuildingContext; import org.hibernate.query.sqm.function.SqmFunctionDescriptor; import org.hibernate.query.sqm.function.SqmFunctionRegistry; import org.hibernate.resource.beans.spi.BeanInstanceProducer; @@ -53,6 +54,12 @@ public interface BootstrapContext { */ TypeConfiguration getTypeConfiguration(); + /** + * Access to the {@code hibernate-models} {@linkplain SourceModelBuildingContext} + */ + @Incubating + SourceModelBuildingContext getModelsContext(); + /** * The {@link SqmFunctionRegistry} belonging to this {@code BootstrapContext}. * @@ -167,11 +174,11 @@ public interface BootstrapContext { * Access to the Jandex index passed by call to * {@link org.hibernate.boot.MetadataBuilder#applyIndexView(Object)}, if any. * - * @apiNote Jandex is currently not used, see - * the roadmap - * * @return The Jandex index + * + * @deprecated Set via the {@code hibernate-models} setting {@code hibernate.models.jandex.index} instead */ + @Deprecated Object getJandexView(); /** diff --git a/hibernate-core/src/main/java/org/hibernate/boot/spi/InFlightMetadataCollector.java b/hibernate-core/src/main/java/org/hibernate/boot/spi/InFlightMetadataCollector.java index e6f9a8b1f169..c663622a2e01 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/spi/InFlightMetadataCollector.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/spi/InFlightMetadataCollector.java @@ -67,14 +67,20 @@ public interface InFlightMetadataCollector extends MetadataImplementor { BootstrapContext getBootstrapContext(); - SourceModelBuildingContext getSourceModelBuildingContext(); + /** + * @deprecated Use {@linkplain BootstrapContext#getModelsContext()} instead. + */ + @Deprecated + default SourceModelBuildingContext getSourceModelBuildingContext() { + return getBootstrapContext().getModelsContext(); + } default ClassDetailsRegistry getClassDetailsRegistry() { - return getSourceModelBuildingContext().getClassDetailsRegistry(); + return getBootstrapContext().getModelsContext().getClassDetailsRegistry(); } default AnnotationDescriptorRegistry getAnnotationDescriptorRegistry() { - return getSourceModelBuildingContext().getAnnotationDescriptorRegistry(); + return getBootstrapContext().getModelsContext().getAnnotationDescriptorRegistry(); } GlobalRegistrations getGlobalRegistrations(); diff --git a/hibernate-core/src/main/java/org/hibernate/jpa/event/internal/CallbackDefinitionResolver.java b/hibernate-core/src/main/java/org/hibernate/jpa/event/internal/CallbackDefinitionResolver.java index bd72888523df..fab4ba7e9218 100644 --- a/hibernate-core/src/main/java/org/hibernate/jpa/event/internal/CallbackDefinitionResolver.java +++ b/hibernate-core/src/main/java/org/hibernate/jpa/event/internal/CallbackDefinitionResolver.java @@ -47,6 +47,7 @@ private static List resolveEntityCallbacks( InFlightMetadataCollector metadataCollector, ClassDetails entityClass, CallbackType callbackType) { + final SourceModelBuildingContext modelsContext = metadataCollector.getBootstrapContext().getModelsContext(); final List callbackDefinitions = new ArrayList<>(); final List callbacksMethodNames = new ArrayList<>(); @@ -89,7 +90,7 @@ private static List resolveEntityCallbacks( } if ( !stopListeners ) { - applyListeners( currentClazz, orderedListeners, metadataCollector.getSourceModelBuildingContext() ); + applyListeners( currentClazz, orderedListeners, modelsContext ); stopListeners = currentClazz.hasDirectAnnotationUsage( ExcludeSuperclassListeners.class ); stopDefaultListeners = currentClazz.hasDirectAnnotationUsage( ExcludeDefaultListeners.class ); } @@ -162,10 +163,9 @@ private static List resolveEmbeddableCallbacks( Property embeddableProperty, CallbackType callbackType) { + final SourceModelBuildingContext modelsContext = metadataCollector.getBootstrapContext().getModelsContext(); final Class embeddableClass = embeddableProperty.getType().getReturnedClass(); - final ClassDetails embeddableClassDetails = - metadataCollector.getSourceModelBuildingContext().getClassDetailsRegistry() - .getClassDetails( embeddableClass.getName() ); + final ClassDetails embeddableClassDetails = modelsContext.getClassDetailsRegistry().getClassDetails( embeddableClass.getName() ); final Getter embeddableGetter = embeddableProperty.getGetter( entityClass ); final List callbackDefinitions = new ArrayList<>(); @@ -269,7 +269,9 @@ private static void applyListeners( * See {@link JpaEventListener} for a better (?) alternative */ public static void resolveLifecycleCallbacks( - ClassDetails entityClass, PersistentClass persistentClass, InFlightMetadataCollector collector) { + ClassDetails entityClass, + PersistentClass persistentClass, + InFlightMetadataCollector collector) { for ( CallbackType callbackType : CallbackType.values() ) { persistentClass.addCallbackDefinitions( resolveEntityCallbacks( collector, entityClass, callbackType ) ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/BootstrapContextTesting.java b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/BootstrapContextTesting.java index 9067101325c4..7cc58554896f 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/BootstrapContextTesting.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/BootstrapContextTesting.java @@ -4,19 +4,12 @@ */ package org.hibernate.orm.test.boot.models; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - import org.hibernate.boot.CacheRegionDefinition; import org.hibernate.boot.archive.scan.internal.StandardScanOptions; import org.hibernate.boot.archive.scan.spi.ScanEnvironment; import org.hibernate.boot.archive.scan.spi.ScanOptions; import org.hibernate.boot.archive.spi.ArchiveDescriptorFactory; import org.hibernate.boot.internal.ClassLoaderAccessImpl; -import org.hibernate.boot.spi.ClassmateContext; import org.hibernate.boot.internal.TypeBeanInstanceProducer; import org.hibernate.boot.model.convert.spi.ConverterDescriptor; import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject; @@ -25,6 +18,7 @@ import org.hibernate.boot.registry.selector.spi.StrategySelector; import org.hibernate.boot.spi.BootstrapContext; import org.hibernate.boot.spi.ClassLoaderAccess; +import org.hibernate.boot.spi.ClassmateContext; import org.hibernate.boot.spi.MetadataBuildingOptions; import org.hibernate.cfg.AvailableSettings; import org.hibernate.engine.config.spi.ConfigurationService; @@ -32,6 +26,7 @@ import org.hibernate.jpa.spi.MutableJpaCompliance; import org.hibernate.metamodel.internal.ManagedTypeRepresentationResolverStandard; import org.hibernate.metamodel.spi.ManagedTypeRepresentationResolver; +import org.hibernate.models.spi.SourceModelBuildingContext; import org.hibernate.query.sqm.function.SqmFunctionDescriptor; import org.hibernate.query.sqm.function.SqmFunctionRegistry; import org.hibernate.resource.beans.spi.BeanInstanceProducer; @@ -39,9 +34,16 @@ import org.hibernate.type.BasicType; import org.hibernate.type.internal.BasicTypeImpl; import org.hibernate.type.spi.TypeConfiguration; - import org.jboss.jandex.IndexView; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import static org.hibernate.boot.internal.BootstrapContextImpl.createModelBuildingContext; + /** * BootstrapContext impl to be able to inject a Jandex index * @@ -73,13 +75,12 @@ public class BootstrapContextTesting implements BootstrapContext { private Object scannerSetting; private ArchiveDescriptorFactory archiveDescriptorFactory; - private IndexView jandexIndex; - private HashMap sqlFunctionMap; private ArrayList auxiliaryDatabaseObjectList; private HashMap, ConverterDescriptor> attributeConverterDescriptorMap; private ArrayList cacheRegionDefinitions; private final ManagedTypeRepresentationResolver representationStrategySelector; + private SourceModelBuildingContext modelsContext; public BootstrapContextTesting( IndexView jandexIndex, @@ -115,7 +116,10 @@ public BootstrapContextTesting( this.sqmFunctionRegistry = new SqmFunctionRegistry(); this.managedBeanRegistry = serviceRegistry.requireService( ManagedBeanRegistry.class ); - this.configurationService = serviceRegistry.requireService( ConfigurationService.class ); } + this.configurationService = serviceRegistry.requireService( ConfigurationService.class ); + + this.modelsContext = createModelBuildingContext( classLoaderService, configService ); + } @Override public StandardServiceRegistry getServiceRegistry() { @@ -132,6 +136,11 @@ public TypeConfiguration getTypeConfiguration() { return typeConfiguration; } + @Override + public SourceModelBuildingContext getModelsContext() { + return modelsContext; + } + @Override public SqmFunctionRegistry getFunctionRegistry() { return sqmFunctionRegistry; @@ -209,7 +218,7 @@ public Object getScanner() { @Override public IndexView getJandexView() { - return jandexIndex; + return null; } @Override @@ -256,7 +265,6 @@ public void release() { scanEnvironment = null; scannerSetting = null; archiveDescriptorFactory = null; - jandexIndex = null; if ( sqlFunctionMap != null ) { sqlFunctionMap.clear(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/intg/AdditionalMappingContributorTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/intg/AdditionalMappingContributorTests.java index 6063b871d874..7f41e08a3d7e 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/intg/AdditionalMappingContributorTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/intg/AdditionalMappingContributorTests.java @@ -299,13 +299,11 @@ public void contribute( InFlightMetadataCollector metadata, ResourceStreamLocator resourceStreamLocator, MetadataBuildingContext buildingContext) { - SourceModelBuildingContext sourceModelBuildingContext = buildingContext.getMetadataCollector() - .getSourceModelBuildingContext(); - final ClassDetailsRegistry classDetailsRegistry = sourceModelBuildingContext - .getClassDetailsRegistry(); + final SourceModelBuildingContext modelsContext = buildingContext.getBootstrapContext().getModelsContext(); + final ClassDetailsRegistry classDetailsRegistry = modelsContext.getClassDetailsRegistry(); - contributeEntity4Details( contributions, sourceModelBuildingContext, classDetailsRegistry ); - contributeEntity5Details( contributions, sourceModelBuildingContext, classDetailsRegistry ); + contributeEntity4Details( contributions, modelsContext, classDetailsRegistry ); + contributeEntity5Details( contributions, modelsContext, classDetailsRegistry ); } private static void contributeEntity4Details( @@ -358,10 +356,9 @@ public void contribute( InFlightMetadataCollector metadata, ResourceStreamLocator resourceStreamLocator, MetadataBuildingContext buildingContext) { - final SourceModelBuildingContext sourceModelBuildingContext = buildingContext.getMetadataCollector() - .getSourceModelBuildingContext(); - final ClassDetailsRegistry classDetailsRegistry = sourceModelBuildingContext.getClassDetailsRegistry(); - contributeEntity6Details( contributions, sourceModelBuildingContext, classDetailsRegistry ); + final SourceModelBuildingContext modelsContext = buildingContext.getBootstrapContext().getModelsContext(); + final ClassDetailsRegistry classDetailsRegistry = modelsContext.getClassDetailsRegistry(); + contributeEntity6Details( contributions, modelsContext, classDetailsRegistry ); } private void contributeEntity6Details( diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/boot/BootstrapContextImpl.java b/hibernate-testing/src/main/java/org/hibernate/testing/boot/BootstrapContextImpl.java index 07e533e74a8b..74c8cc19348e 100644 --- a/hibernate-testing/src/main/java/org/hibernate/testing/boot/BootstrapContextImpl.java +++ b/hibernate-testing/src/main/java/org/hibernate/testing/boot/BootstrapContextImpl.java @@ -25,6 +25,7 @@ import org.hibernate.jpa.spi.MutableJpaCompliance; import org.hibernate.metamodel.internal.ManagedTypeRepresentationResolverStandard; import org.hibernate.metamodel.spi.ManagedTypeRepresentationResolver; +import org.hibernate.models.spi.SourceModelBuildingContext; import org.hibernate.query.sqm.function.SqmFunctionDescriptor; import org.hibernate.query.sqm.function.SqmFunctionRegistry; import org.hibernate.resource.beans.spi.BeanInstanceProducer; @@ -62,6 +63,11 @@ public TypeConfiguration getTypeConfiguration() { return delegate.getTypeConfiguration(); } + @Override + public SourceModelBuildingContext getModelsContext() { + return delegate.getModelsContext(); + } + @Override public SqmFunctionRegistry getFunctionRegistry() { return delegate.getFunctionRegistry();