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 fa08ec2e067b..f8e7121bc075 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 @@ -22,7 +22,6 @@ import org.hibernate.boot.model.NamedEntityGraphDefinition; import org.hibernate.boot.model.TypeDefinition; import org.hibernate.boot.model.TypeDefinitionRegistry; -import org.hibernate.boot.model.TypeDefinitionRegistryStandardImpl; import org.hibernate.boot.model.convert.internal.AttributeConverterManager; import org.hibernate.boot.model.convert.internal.ClassBasedConverterDescriptor; import org.hibernate.boot.model.convert.spi.ConverterAutoApplyHandler; @@ -710,7 +709,7 @@ public Map getNamedEntityGraphs() { @Override public void addNamedEntityGraph(NamedEntityGraphDefinition definition) { - final String name = definition.getRegisteredName(); + final String name = definition.name(); final NamedEntityGraphDefinition previous = namedEntityGraphMap.put( name, definition ); if ( previous != null ) { throw new DuplicateMappingException( DuplicateMappingException.Type.NAMED_ENTITY_GRAPH, name ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuildingContextRootImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuildingContextRootImpl.java index a31cfb3b5b1f..9f7d33f01b0c 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuildingContextRootImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuildingContextRootImpl.java @@ -4,7 +4,6 @@ */ package org.hibernate.boot.internal; -import org.hibernate.boot.model.TypeDefinitionRegistryStandardImpl; import org.hibernate.boot.model.naming.ObjectNameNormalizer; import org.hibernate.boot.spi.BootstrapContext; import org.hibernate.boot.spi.InFlightMetadataCollector; diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/TypeDefinitionRegistryStandardImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/TypeDefinitionRegistryStandardImpl.java new file mode 100644 index 000000000000..e96768c6bfc5 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/TypeDefinitionRegistryStandardImpl.java @@ -0,0 +1,117 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.boot.internal; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +import org.hibernate.boot.model.TypeDefinition; +import org.hibernate.boot.model.TypeDefinitionRegistry; +import org.hibernate.type.descriptor.java.BasicJavaType; + +import org.jboss.logging.Logger; + +import static org.hibernate.internal.util.StringHelper.isEmpty; + +/** + * Basic implementation of {@link TypeDefinitionRegistry}. + * + * @author Chris Cranford + */ +public class TypeDefinitionRegistryStandardImpl implements TypeDefinitionRegistry { + private static final Logger log = Logger.getLogger( TypeDefinitionRegistryStandardImpl.class ); + + private final TypeDefinitionRegistry parent; + private final Map typeDefinitionMap = new HashMap<>(); + + public TypeDefinitionRegistryStandardImpl() { + this( null ); + } + + public TypeDefinitionRegistryStandardImpl(TypeDefinitionRegistry parent) { + this.parent = parent; + } + + @Override + public TypeDefinition resolve(String typeName) { + final TypeDefinition localDefinition = typeDefinitionMap.get( typeName ); + if ( localDefinition != null ) { + return localDefinition; + } + else if ( parent != null ) { + return parent.resolve( typeName ); + } + else { + return null; + } + } + + @Override + public TypeDefinition resolveAutoApplied(BasicJavaType jtd) { + // For now, check the definition map for an entry keyed by the JTD name. + // Ultimately should maybe have TypeDefinition or the registry keep explicit + // track of auto-applied definitions. + return jtd.getJavaType() == null ? null : typeDefinitionMap.get( jtd.getTypeName() ); + } + + @Override + public TypeDefinitionRegistry register(TypeDefinition typeDefinition) { + return register( typeDefinition, DuplicationStrategy.OVERWRITE ); + } + + @Override + public TypeDefinitionRegistry register(TypeDefinition typeDefinition, DuplicationStrategy duplicationStrategy) { + if ( typeDefinition == null ) { + throw new IllegalArgumentException( "TypeDefinition to register cannot be null" ); + } + + if ( typeDefinition.getTypeImplementorClass() == null ) { + throw new IllegalArgumentException( "TypeDefinition to register cannot define null #typeImplementorClass" ); + } + + if ( !isEmpty( typeDefinition.getName() ) ) { + register( typeDefinition.getName(), typeDefinition, duplicationStrategy ); + } + + if ( typeDefinition.getRegistrationKeys() != null ) { + for ( String registrationKey : typeDefinition.getRegistrationKeys() ) { + register( registrationKey, typeDefinition, duplicationStrategy ); + } + } + + return this; + } + + private void register(String name, TypeDefinition typeDefinition, DuplicationStrategy duplicationStrategy) { + if ( duplicationStrategy == DuplicationStrategy.KEEP ) { + if ( !typeDefinitionMap.containsKey( name ) ) { + typeDefinitionMap.put( name, typeDefinition ); + } + } + else { + final TypeDefinition existing = typeDefinitionMap.put( name, typeDefinition ); + if ( existing != null && existing != typeDefinition ) { + if ( duplicationStrategy == DuplicationStrategy.OVERWRITE ) { + log.debugf( "Overwrote existing registration [%s] for type definition.", name ); + } + else { + throw new IllegalArgumentException( + String.format( + Locale.ROOT, + "Attempted to overwrite registration [%s] for type definition.", + name + ) + ); + } + } + } + } + + @Override + public Map copyRegistrationMap() { + return new HashMap<>( typeDefinitionMap ); + } +} diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/NamedEntityGraphDefinition.java b/hibernate-core/src/main/java/org/hibernate/boot/model/NamedEntityGraphDefinition.java index 9bcd59f41e89..15b0e1c03d10 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/NamedEntityGraphDefinition.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/NamedEntityGraphDefinition.java @@ -5,74 +5,29 @@ package org.hibernate.boot.model; import jakarta.persistence.NamedEntityGraph; -import org.hibernate.mapping.PersistentClass; -import static org.hibernate.internal.util.StringHelper.isNotEmpty; +import java.util.Objects; /** * Models a {@linkplain NamedEntityGraph @NamedEntityGraph} * * @author Steve Ebersole */ -public class NamedEntityGraphDefinition { +public record NamedEntityGraphDefinition + (String name, String entityName, Source source, NamedGraphCreator graphCreator) { public enum Source { JPA, PARSED } - private final String name; - - private final String entityName; - - private final Source source; - private final NamedGraphCreator graphCreator; - - public NamedEntityGraphDefinition(jakarta.persistence.NamedEntityGraph annotation, String jpaEntityName, String entityName) { - this.name = isNotEmpty( annotation.name() ) ? annotation.name() : jpaEntityName; - if ( name == null ) { - throw new IllegalArgumentException( "Named entity graph name cannot be null" ); - } - - this.entityName = entityName; - - source = Source.JPA; - graphCreator = new NamedGraphCreatorJpa( annotation, jpaEntityName ); - } - - public NamedEntityGraphDefinition(org.hibernate.annotations.NamedEntityGraph annotation, PersistentClass persistentClass) { - this.name = isNotEmpty( annotation.name() ) ? annotation.name() : persistentClass.getJpaEntityName(); - if ( name == null ) { - throw new IllegalArgumentException( "Named entity graph name cannot be null" ); - } - - this.entityName = persistentClass.getEntityName(); - - source = Source.PARSED; - graphCreator = new NamedGraphCreatorParsed( persistentClass.getMappedClass(), annotation ); - } - - public NamedEntityGraphDefinition(org.hibernate.annotations.NamedEntityGraph annotation) { - this.name = annotation.name(); - if ( name == null ) { - throw new IllegalArgumentException( "Named entity graph name cannot be null" ); - } - - this.entityName = null; - - source = Source.PARSED; - graphCreator = new NamedGraphCreatorParsed( annotation ); + public NamedEntityGraphDefinition { + Objects.requireNonNull( name, "Named entity graph name cannot be null" ); } + @Deprecated(since = "7.0", forRemoval = true) public String getRegisteredName() { return name; } + @Deprecated(since = "7.0", forRemoval = true) public String getEntityName() { return entityName; } - - public Source getSource() { - return source; - } - - public NamedGraphCreator getGraphCreator() { - return graphCreator; - } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/TypeDefinitionRegistryStandardImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/model/TypeDefinitionRegistryStandardImpl.java index b0eca8feb9be..b794412e8dd5 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/TypeDefinitionRegistryStandardImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/TypeDefinitionRegistryStandardImpl.java @@ -4,112 +4,23 @@ */ package org.hibernate.boot.model; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - -import org.hibernate.type.descriptor.java.BasicJavaType; - -import org.jboss.logging.Logger; - -import static org.hibernate.internal.util.StringHelper.isEmpty; - /** * Basic implementation of {@link TypeDefinitionRegistry}. * - * @author Chris Cranford + * @deprecated Internal code should use the internal implementation class + * {@link org.hibernate.boot.internal.TypeDefinitionRegistryStandardImpl}. + * This class will be removed. */ -public class TypeDefinitionRegistryStandardImpl implements TypeDefinitionRegistry { - private static final Logger log = Logger.getLogger( TypeDefinitionRegistryStandardImpl.class ); - - private final TypeDefinitionRegistry parent; - private final Map typeDefinitionMap = new HashMap<>(); +@Deprecated(since = "7.0", forRemoval = true) +public class TypeDefinitionRegistryStandardImpl + extends org.hibernate.boot.internal.TypeDefinitionRegistryStandardImpl { public TypeDefinitionRegistryStandardImpl() { - this( null ); + super(); } public TypeDefinitionRegistryStandardImpl(TypeDefinitionRegistry parent) { - this.parent = parent; - } - - @Override - public TypeDefinition resolve(String typeName) { - final TypeDefinition localDefinition = typeDefinitionMap.get( typeName ); - if ( localDefinition != null ) { - return localDefinition; - } - else if ( parent != null ) { - return parent.resolve( typeName ); - } - else { - return null; - } - } - - @Override - public TypeDefinition resolveAutoApplied(BasicJavaType jtd) { - // For now, check the definition map for an entry keyed by the JTD name. - // Ultimately should maybe have TypeDefinition or the registry keep explicit - // track of auto-applied definitions. - return jtd.getJavaType() == null ? null : typeDefinitionMap.get( jtd.getTypeName() ); - } - - @Override - public TypeDefinitionRegistry register(TypeDefinition typeDefinition) { - return register( typeDefinition, DuplicationStrategy.OVERWRITE ); - } - - @Override - public TypeDefinitionRegistry register(TypeDefinition typeDefinition, DuplicationStrategy duplicationStrategy) { - if ( typeDefinition == null ) { - throw new IllegalArgumentException( "TypeDefinition to register cannot be null" ); - } - - if ( typeDefinition.getTypeImplementorClass() == null ) { - throw new IllegalArgumentException( "TypeDefinition to register cannot define null #typeImplementorClass" ); - } - - if ( !isEmpty( typeDefinition.getName() ) ) { - register( typeDefinition.getName(), typeDefinition, duplicationStrategy ); - } - - if ( typeDefinition.getRegistrationKeys() != null ) { - for ( String registrationKey : typeDefinition.getRegistrationKeys() ) { - register( registrationKey, typeDefinition, duplicationStrategy ); - } - } - - return this; + super(parent); } - private void register(String name, TypeDefinition typeDefinition, DuplicationStrategy duplicationStrategy) { - if ( duplicationStrategy == DuplicationStrategy.KEEP ) { - if ( !typeDefinitionMap.containsKey( name ) ) { - typeDefinitionMap.put( name, typeDefinition ); - } - } - else { - final TypeDefinition existing = typeDefinitionMap.put( name, typeDefinition ); - if ( existing != null && existing != typeDefinition ) { - if ( duplicationStrategy == DuplicationStrategy.OVERWRITE ) { - log.debugf( "Overwrote existing registration [%s] for type definition.", name ); - } - else { - throw new IllegalArgumentException( - String.format( - Locale.ROOT, - "Attempted to overwrite registration [%s] for type definition.", - name - ) - ); - } - } - } - } - - @Override - public Map copyRegistrationMap() { - return new HashMap<>( typeDefinitionMap ); - } } 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 041806c03f02..6a9f3b82c7d4 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 @@ -30,6 +30,7 @@ import org.hibernate.boot.models.JpaAnnotations; import org.hibernate.boot.models.spi.GlobalRegistrations; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; +import org.hibernate.boot.spi.InFlightMetadataCollector; import org.hibernate.boot.spi.MetadataBuildingContext; import org.hibernate.internal.CoreMessageLogger; import org.hibernate.models.spi.AnnotationTarget; @@ -37,7 +38,6 @@ import org.hibernate.models.spi.SourceModelBuildingContext; import org.hibernate.resource.beans.internal.FallbackBeanInstanceProducer; import org.hibernate.resource.beans.spi.ManagedBeanRegistry; -import org.hibernate.type.descriptor.java.BasicJavaType; import org.hibernate.type.descriptor.jdbc.JdbcType; import java.util.HashMap; @@ -71,30 +71,31 @@ public final class AnnotationBinder { private AnnotationBinder() {} public static void bindDefaults(MetadataBuildingContext context) { - final GlobalRegistrations globalRegistrations = context.getMetadataCollector().getGlobalRegistrations(); + final InFlightMetadataCollector metadataCollector = context.getMetadataCollector(); + final GlobalRegistrations globalRegistrations = metadataCollector.getGlobalRegistrations(); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // id generators globalRegistrations.getSequenceGeneratorRegistrations().forEach( (name, generatorRegistration) -> { - final IdentifierGeneratorDefinition.Builder definitionBuilder = new IdentifierGeneratorDefinition.Builder(); + final var definitionBuilder = new IdentifierGeneratorDefinition.Builder(); interpretSequenceGenerator( generatorRegistration.configuration(), definitionBuilder ); final IdentifierGeneratorDefinition idGenDef = definitionBuilder.build(); if ( LOG.isTraceEnabled() ) { LOG.trace( "Adding global sequence generator with name: " + name ); } - context.getMetadataCollector().addDefaultIdentifierGenerator( idGenDef ); + metadataCollector.addDefaultIdentifierGenerator( idGenDef ); } ); globalRegistrations.getTableGeneratorRegistrations().forEach( (name, generatorRegistration) -> { - final IdentifierGeneratorDefinition.Builder definitionBuilder = new IdentifierGeneratorDefinition.Builder(); + final var definitionBuilder = new IdentifierGeneratorDefinition.Builder(); interpretTableGenerator( generatorRegistration.configuration(), definitionBuilder ); final IdentifierGeneratorDefinition idGenDef = definitionBuilder.build(); if ( LOG.isTraceEnabled() ) { LOG.trace( "Adding global table generator with name: " + name ); } - context.getMetadataCollector().addDefaultIdentifierGenerator( idGenDef ); + metadataCollector.addDefaultIdentifierGenerator( idGenDef ); } ); @@ -151,13 +152,15 @@ public static void bindPackage(ClassLoaderService cls, String packageName, Metad } private static void bindNamedEntityGraphs(ClassDetails packageInfoClassDetails, MetadataBuildingContext context) { + final InFlightMetadataCollector collector = context.getMetadataCollector(); packageInfoClassDetails.forEachRepeatedAnnotationUsages( HibernateAnnotations.NAMED_ENTITY_GRAPH, modelsContext( context ), - (annotation) -> { - final NamedEntityGraphDefinition graphDefinition = new NamedEntityGraphDefinition( annotation ); - context.getMetadataCollector().addNamedEntityGraph( graphDefinition ); - } + (annotation) -> collector.addNamedEntityGraph( new NamedEntityGraphDefinition( + annotation.name(), null, + NamedEntityGraphDefinition.Source.PARSED, + new NamedGraphCreatorParsed( annotation ) + ) ) ); } @@ -293,29 +296,34 @@ private static void handleJdbcTypeRegistration( MetadataBuildingContext context, ManagedBeanRegistry managedBeanRegistry, JdbcTypeRegistration annotation) { - final Class jdbcTypeClass = annotation.value(); - final JdbcType jdbcType = !context.getBuildingOptions().isAllowExtensionsInCdi() - ? FallbackBeanInstanceProducer.INSTANCE.produceBeanInstance( jdbcTypeClass ) - : managedBeanRegistry.getBean( jdbcTypeClass ).getBeanInstance(); + final JdbcType jdbcType = getBean( context, managedBeanRegistry, annotation.value() ); + context.getMetadataCollector() + .addJdbcTypeRegistration( jdbcTypeCode( annotation, jdbcType ), jdbcType ); + } + + private static int jdbcTypeCode(JdbcTypeRegistration annotation, JdbcType jdbcType) { final int registrationCode = annotation.registrationCode(); - final int typeCode = registrationCode == Integer.MIN_VALUE + return registrationCode == Integer.MIN_VALUE ? jdbcType.getDefaultSqlTypeCode() : registrationCode; - context.getMetadataCollector().addJdbcTypeRegistration( typeCode, jdbcType ); } private static void handleJavaTypeRegistration( MetadataBuildingContext context, ManagedBeanRegistry managedBeanRegistry, JavaTypeRegistration annotation) { - final Class> javaTypeClass = annotation.descriptorClass(); - final BasicJavaType javaType = !context.getBuildingOptions().isAllowExtensionsInCdi() - ? FallbackBeanInstanceProducer.INSTANCE.produceBeanInstance( javaTypeClass ) - : managedBeanRegistry.getBean( javaTypeClass ).getBeanInstance(); - context.getMetadataCollector().addJavaTypeRegistration( - annotation.javaType(), - javaType - ); + context.getMetadataCollector() + .addJavaTypeRegistration( annotation.javaType(), + getBean( context, managedBeanRegistry, annotation.descriptorClass() ) ); + } + + private static T getBean( + MetadataBuildingContext context, + ManagedBeanRegistry managedBeanRegistry, + Class jdbcTypeClass) { + return context.getBuildingOptions().isAllowExtensionsInCdi() + ? managedBeanRegistry.getBean( jdbcTypeClass ).getBeanInstance() + : FallbackBeanInstanceProducer.INSTANCE.produceBeanInstance( jdbcTypeClass ); } private static void bindEmbeddableInstantiatorRegistrations( @@ -381,23 +389,23 @@ private static void bindConverterRegistrations(AnnotationTarget container, Metad } private static void handleConverterRegistration(ConverterRegistration registration, MetadataBuildingContext context) { - context.getMetadataCollector().getConverterRegistry().addRegisteredConversion( new RegisteredConversion( - registration.domainType(), - registration.converter(), - registration.autoApply(), - context - ) ); + context.getMetadataCollector().getConverterRegistry() + .addRegisteredConversion( new RegisteredConversion( + registration.domainType(), + registration.converter(), + registration.autoApply(), + context + ) ); } public static void bindFetchProfilesForClass(AnnotationTarget annotatedClass, MetadataBuildingContext context) { bindFetchProfiles( annotatedClass, context ); } - public static void bindFetchProfilesForPackage(ClassLoaderService cls, String packageName, MetadataBuildingContext context) { - final ClassDetails packageInfoClassDetails = context - .getMetadataCollector() - .getClassDetailsRegistry() - .findClassDetails( packageName + ".package-info" ); + public static void bindFetchProfilesForPackage(String packageName, MetadataBuildingContext context) { + final ClassDetails packageInfoClassDetails = + context.getMetadataCollector().getClassDetailsRegistry() + .findClassDetails( packageName + ".package-info" ); if ( packageInfoClassDetails != null ) { bindFetchProfiles( packageInfoClassDetails, context ); } @@ -423,7 +431,8 @@ private static void bindFetchProfile(FetchProfile fetchProfile, MetadataBuilding + " (join fetching is eager by nature)" ); } - context.getMetadataCollector().addSecondPass( new FetchOverrideSecondPass( name, fetchOverride, context ) ); + context.getMetadataCollector() + .addSecondPass( new FetchOverrideSecondPass( name, fetchOverride, context ) ); } } // otherwise, it's a fetch profile defined in XML, and it overrides @@ -432,12 +441,11 @@ private static void bindFetchProfile(FetchProfile fetchProfile, MetadataBuilding private static boolean reuseOrCreateFetchProfile(MetadataBuildingContext context, String name) { // We tolerate multiple @FetchProfile annotations for same named profile - org.hibernate.mapping.FetchProfile existing = context.getMetadataCollector().getFetchProfile( name ); + var existing = context.getMetadataCollector().getFetchProfile( name ); if ( existing == null ) { // no existing profile, so create a new one - org.hibernate.mapping.FetchProfile profile = - new org.hibernate.mapping.FetchProfile( name, ANNOTATIONS ); - context.getMetadataCollector().addFetchProfile( profile ); + context.getMetadataCollector() + .addFetchProfile( new org.hibernate.mapping.FetchProfile( name, ANNOTATIONS ) ); return true; } else { @@ -457,13 +465,14 @@ public static Map buildInheritanceStates( List orderedClasses, MetadataBuildingContext buildingContext) { final Map inheritanceStatePerClass = new HashMap<>( orderedClasses.size() ); + final InFlightMetadataCollector collector = buildingContext.getMetadataCollector(); for ( ClassDetails clazz : orderedClasses ) { final InheritanceState superclassState = getSuperclassInheritanceState( clazz, inheritanceStatePerClass ); final InheritanceState state = new InheritanceState( clazz, inheritanceStatePerClass, buildingContext ); - final AnnotatedClassType classType = buildingContext.getMetadataCollector().getClassType( clazz ); + final AnnotatedClassType classType = collector.getClassType( clazz ); if ( classType == EMBEDDABLE && !clazz.hasDirectAnnotationUsage( Imported.class ) ) { final String className = clazz.getName(); - buildingContext.getMetadataCollector().addImport( unqualify( className ), className ); + collector.addImport( unqualify( className ), className ); } if ( superclassState != null ) { //the classes are ordered thus preventing an NPE @@ -473,10 +482,7 @@ public static Map buildInheritanceStates( if ( superEntityState != null ) { state.setHasParents( true ); if ( classType == EMBEDDABLE ) { - buildingContext.getMetadataCollector().registerEmbeddableSubclass( - superEntityState.getClassDetails(), - clazz - ); + collector.registerEmbeddableSubclass( superEntityState.getClassDetails(), clazz ); } } logMixedInheritance( clazz, superclassState, state ); 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 8506a79245d6..5273483a7160 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 @@ -1520,17 +1520,36 @@ private void processParsedNamedGraphs() { private void processNamedEntityGraph(NamedEntityGraph annotation) { if ( annotation != null ) { getMetadataCollector() - .addNamedEntityGraph( new NamedEntityGraphDefinition( annotation, name, persistentClass.getEntityName() ) ); + .addNamedEntityGraph( namedEntityGraphDefinition( annotation ) ); } } + private NamedEntityGraphDefinition namedEntityGraphDefinition(NamedEntityGraph annotation) { + final String explicitName = annotation.name(); + return new NamedEntityGraphDefinition( + StringHelper.isNotEmpty( explicitName ) ? explicitName : name, + persistentClass.getEntityName(), + NamedEntityGraphDefinition.Source.JPA, + new NamedGraphCreatorJpa( annotation, name ) ); + } + private void processParsedNamedEntityGraph(org.hibernate.annotations.NamedEntityGraph annotation) { if ( annotation != null ) { getMetadataCollector() - .addNamedEntityGraph( new NamedEntityGraphDefinition( annotation, persistentClass ) ); + .addNamedEntityGraph( namedEntityGraphDefinition( annotation ) ); } } + private NamedEntityGraphDefinition namedEntityGraphDefinition(org.hibernate.annotations.NamedEntityGraph annotation) { + final String explicitName = annotation.name(); + return new NamedEntityGraphDefinition( + StringHelper.isNotEmpty( explicitName ) ? explicitName : persistentClass.getJpaEntityName(), + persistentClass.getEntityName(), + NamedEntityGraphDefinition.Source.PARSED, + new NamedGraphCreatorParsed( persistentClass.getMappedClass(), annotation ) + ); + } + private void bindDiscriminatorValue() { final DiscriminatorValue discriminatorValueAnn = annotatedClass.getAnnotationUsage( DiscriminatorValue.class, modelsContext() ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/NamedGraphCreatorJpa.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/NamedGraphCreatorJpa.java similarity index 72% rename from hibernate-core/src/main/java/org/hibernate/boot/model/NamedGraphCreatorJpa.java rename to hibernate-core/src/main/java/org/hibernate/boot/model/internal/NamedGraphCreatorJpa.java index dd919bfd1f3c..fdf036fc8b2e 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/NamedGraphCreatorJpa.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/NamedGraphCreatorJpa.java @@ -2,35 +2,35 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.boot.model; +package org.hibernate.boot.model.internal; import jakarta.persistence.NamedAttributeNode; import jakarta.persistence.NamedEntityGraph; import jakarta.persistence.NamedSubgraph; -import jakarta.persistence.metamodel.Attribute; import org.hibernate.AnnotationException; +import org.hibernate.boot.model.NamedGraphCreator; import org.hibernate.graph.internal.RootGraphImpl; import org.hibernate.graph.spi.AttributeNodeImplementor; import org.hibernate.graph.spi.GraphImplementor; import org.hibernate.graph.spi.RootGraphImplementor; import org.hibernate.graph.spi.SubGraphImplementor; -import org.hibernate.internal.util.StringHelper; import org.hibernate.metamodel.model.domain.EntityDomainType; import java.util.function.Function; import static org.hibernate.internal.util.StringHelper.isNotEmpty; +import static org.hibernate.internal.util.StringHelper.nullIfEmpty; /** * @author Steve Ebersole */ -public class NamedGraphCreatorJpa implements NamedGraphCreator { +class NamedGraphCreatorJpa implements NamedGraphCreator { private final String name; private final NamedEntityGraph annotation; private final String jpaEntityName; - public NamedGraphCreatorJpa(NamedEntityGraph annotation, String jpaEntityName) { - final String name = StringHelper.nullIfEmpty( annotation.name() ); + NamedGraphCreatorJpa(NamedEntityGraph annotation, String jpaEntityName) { + final String name = nullIfEmpty( annotation.name() ); this.name = name == null ? jpaEntityName : name; this.annotation = annotation; this.jpaEntityName = jpaEntityName; @@ -41,8 +41,10 @@ public RootGraphImplementor createEntityGraph( Function, EntityDomainType> entityDomainClassResolver, Function> entityDomainNameResolver) { //noinspection unchecked - final EntityDomainType rootEntityType = (EntityDomainType) entityDomainNameResolver.apply( jpaEntityName ); - final RootGraphImplementor entityGraph = createRootGraph( name, rootEntityType, annotation.includeAllAttributes() ); + final EntityDomainType rootEntityType = + (EntityDomainType) entityDomainNameResolver.apply( jpaEntityName ); + final RootGraphImplementor entityGraph = + createRootGraph( name, rootEntityType, annotation.includeAllAttributes() ); if ( annotation.subclassSubgraphs() != null ) { for ( NamedSubgraph subclassSubgraph : annotation.subclassSubgraphs() ) { @@ -72,36 +74,28 @@ private static RootGraphImplementor createRootGraph( boolean includeAllAttributes) { final RootGraphImpl entityGraph = new RootGraphImpl<>( name, rootEntityType ); if ( includeAllAttributes ) { - for ( Attribute attribute : rootEntityType.getAttributes() ) { + for ( var attribute : rootEntityType.getAttributes() ) { entityGraph.addAttributeNodes( attribute ); } } return entityGraph; } - private void applyNamedAttributeNodes( + + private void applyNamedAttributeNodes( NamedAttributeNode[] namedAttributeNodes, NamedEntityGraph namedEntityGraph, GraphImplementor graphNode) { for ( NamedAttributeNode namedAttributeNode : namedAttributeNodes ) { - final String value = namedAttributeNode.value(); - final AttributeNodeImplementor attributeNode = - (AttributeNodeImplementor) graphNode.addAttributeNode( value ); - - if ( isNotEmpty( namedAttributeNode.subgraph() ) ) { - applyNamedSubgraphs( - namedEntityGraph, - namedAttributeNode.subgraph(), - attributeNode, - false - ); + final var attributeNode = + (AttributeNodeImplementor) + graphNode.addAttributeNode( namedAttributeNode.value() ); + final String subgraph = namedAttributeNode.subgraph(); + if ( isNotEmpty( subgraph ) ) { + applyNamedSubgraphs( namedEntityGraph, subgraph, attributeNode, false ); } - if ( isNotEmpty( namedAttributeNode.keySubgraph() ) ) { - applyNamedSubgraphs( - namedEntityGraph, - namedAttributeNode.keySubgraph(), - attributeNode, - true - ); + final String keySubgraph = namedAttributeNode.keySubgraph(); + if ( isNotEmpty( keySubgraph ) ) { + applyNamedSubgraphs( namedEntityGraph, keySubgraph, attributeNode, true ); } } } @@ -113,21 +107,25 @@ private void applyNamedSubgraphs( boolean isKeySubGraph) { for ( NamedSubgraph namedSubgraph : namedEntityGraph.subgraphs() ) { if ( subgraphName.equals( namedSubgraph.name() ) ) { - final Class subgraphType = namedSubgraph.type(); - final SubGraphImplementor subgraph; - if ( subgraphType.equals( void.class ) ) { // unspecified - subgraph = attributeNode.addValueSubgraph(); - } - else { - subgraph = isKeySubGraph - ? makeAttributeNodeKeySubgraph( attributeNode, subgraphType ) - : makeAttributeNodeValueSubgraph( attributeNode, subgraphType ); - } - applyNamedAttributeNodes( namedSubgraph.attributeNodes(), namedEntityGraph, subgraph ); + applyNamedAttributeNodes( namedSubgraph.attributeNodes(), namedEntityGraph, + createSubgraph( attributeNode, isKeySubGraph, namedSubgraph.type() ) ); } } } + private static SubGraphImplementor createSubgraph( + AttributeNodeImplementor attributeNode, + boolean isKeySubGraph, Class subgraphType) { + if ( void.class.equals( subgraphType ) ) { // unspecified + return attributeNode.addValueSubgraph(); + } + else { + return isKeySubGraph + ? makeAttributeNodeKeySubgraph( attributeNode, subgraphType ) + : makeAttributeNodeValueSubgraph( attributeNode, subgraphType ); + } + } + private static SubGraphImplementor makeAttributeNodeValueSubgraph( AttributeNodeImplementor attributeNode, Class subgraphType) { final Class attributeValueType = diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/NamedGraphCreatorParsed.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/NamedGraphCreatorParsed.java similarity index 88% rename from hibernate-core/src/main/java/org/hibernate/boot/model/NamedGraphCreatorParsed.java rename to hibernate-core/src/main/java/org/hibernate/boot/model/internal/NamedGraphCreatorParsed.java index 38b897226a60..a264f3521fd2 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/NamedGraphCreatorParsed.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/NamedGraphCreatorParsed.java @@ -2,38 +2,40 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.boot.model; +package org.hibernate.boot.model.internal; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.UnknownEntityTypeException; import org.hibernate.annotations.NamedEntityGraph; +import org.hibernate.boot.model.NamedGraphCreator; import org.hibernate.grammars.graph.GraphLanguageLexer; import org.hibernate.grammars.graph.GraphLanguageParser; import org.hibernate.graph.InvalidGraphException; import org.hibernate.graph.internal.parse.EntityNameResolver; import org.hibernate.graph.internal.parse.GraphParsing; import org.hibernate.graph.spi.RootGraphImplementor; -import org.hibernate.internal.util.StringHelper; import org.hibernate.metamodel.model.domain.EntityDomainType; import java.util.function.Function; +import static org.hibernate.internal.util.StringHelper.nullIfEmpty; + /** * @author Steve Ebersole */ -public class NamedGraphCreatorParsed implements NamedGraphCreator { +class NamedGraphCreatorParsed implements NamedGraphCreator { private final @Nullable String name; private final @Nullable Class entityType; private final NamedEntityGraph annotation; - public NamedGraphCreatorParsed(NamedEntityGraph annotation) { + NamedGraphCreatorParsed(NamedEntityGraph annotation) { this( null, annotation ); } - public NamedGraphCreatorParsed(@Nullable Class entityType, NamedEntityGraph annotation) { - this.name = StringHelper.nullIfEmpty( annotation.name() ); + NamedGraphCreatorParsed(@Nullable Class entityType, NamedEntityGraph annotation) { + this.name = nullIfEmpty( annotation.name() ); this.entityType = entityType; this.annotation = annotation; } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/annotations/AnnotationMetadataSourceProcessorImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/annotations/AnnotationMetadataSourceProcessorImpl.java index 59638c438118..82f57a416555 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/annotations/AnnotationMetadataSourceProcessorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/annotations/AnnotationMetadataSourceProcessorImpl.java @@ -264,7 +264,7 @@ private void orderHierarchy(List copy, List newList, @Override public void postProcessEntityHierarchies() { for ( String annotatedPackage : annotatedPackages ) { - AnnotationBinder.bindFetchProfilesForPackage( classLoaderService, annotatedPackage, rootMetadataBuildingContext ); + AnnotationBinder.bindFetchProfilesForPackage( annotatedPackage, rootMetadataBuildingContext ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/MappingDocument.java b/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/MappingDocument.java index d52c118ef069..f575a93beacc 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/MappingDocument.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/MappingDocument.java @@ -18,7 +18,7 @@ import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmNamedQueryType; import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmTypeDefinitionType; import org.hibernate.boot.model.TypeDefinitionRegistry; -import org.hibernate.boot.model.TypeDefinitionRegistryStandardImpl; +import org.hibernate.boot.internal.TypeDefinitionRegistryStandardImpl; import org.hibernate.boot.model.naming.ObjectNameNormalizer; import org.hibernate.boot.model.source.internal.OverriddenMappingDefaults; import org.hibernate.boot.model.source.spi.MetadataSourceProcessor; @@ -49,7 +49,7 @@ public class MappingDocument implements HbmLocalMetadataBuildingContext, Metadat private final ToolingHintContext toolingHintContext; - private final TypeDefinitionRegistryStandardImpl typeDefinitionRegistry; + private final TypeDefinitionRegistry typeDefinitionRegistry; private final String contributor; @@ -65,20 +65,21 @@ public MappingDocument( // todo : allow for a split in default-lazy for singular/plural - this.mappingDefaults = new OverriddenMappingDefaults.Builder( rootBuildingContext.getEffectiveDefaults() ) - .setImplicitSchemaName( documentRoot.getSchema() ) - .setImplicitCatalogName( documentRoot.getCatalog() ) - .setImplicitPackageName( documentRoot.getPackage() ) - .setImplicitPropertyAccessorName( documentRoot.getDefaultAccess() ) -// .setImplicitCascadeStyleName( documentRoot.getDefaultCascade() ) - .setEntitiesImplicitlyLazy( documentRoot.isDefaultLazy() ) - .setAutoImportEnabled( documentRoot.isAutoImport() ) - .setPluralAttributesImplicitlyLazy( documentRoot.isDefaultLazy() ) - .build(); - - this.toolingHintContext = Helper.collectToolingHints( null, documentRoot ); - - this.typeDefinitionRegistry = new TypeDefinitionRegistryStandardImpl( rootBuildingContext.getTypeDefinitionRegistry() ); + mappingDefaults = + new OverriddenMappingDefaults.Builder( rootBuildingContext.getEffectiveDefaults() ) + .setImplicitSchemaName( documentRoot.getSchema() ) + .setImplicitCatalogName( documentRoot.getCatalog() ) + .setImplicitPackageName( documentRoot.getPackage() ) + .setImplicitPropertyAccessorName( documentRoot.getDefaultAccess() ) +// .setImplicitCascadeStyleName( documentRoot.getDefaultCascade() ) + .setEntitiesImplicitlyLazy( documentRoot.isDefaultLazy() ) + .setAutoImportEnabled( documentRoot.isAutoImport() ) + .setPluralAttributesImplicitlyLazy( documentRoot.isDefaultLazy() ) + .build(); + + toolingHintContext = Helper.collectToolingHints( null, documentRoot ); + + typeDefinitionRegistry = new TypeDefinitionRegistryStandardImpl( rootBuildingContext.getTypeDefinitionRegistry() ); } public JaxbHbmHibernateMapping getDocumentRoot() { @@ -103,7 +104,9 @@ private static String qualifyIfNeeded(String name, String implicitPackageName) { if ( name.indexOf( '.' ) < 0 && implicitPackageName != null ) { return implicitPackageName + '.' + name; } - return name; + else { + return name; + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/InjectionHelper.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/InjectionHelper.java index 275522d51f00..4f335f63ffc4 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/InjectionHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/InjectionHelper.java @@ -27,8 +27,8 @@ public static void injectEntityGraph( try { injectField( metamodelClass, - '_' + javaIdentifier( definition.getRegisteredName() ), - jpaMetamodel.findEntityGraphByName( definition.getRegisteredName() ), + '_' + javaIdentifier( definition.name() ), + jpaMetamodel.findEntityGraphByName( definition.name() ), false ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java index 74366fdcc52a..295dd5467986 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java @@ -495,11 +495,11 @@ private void applyNamedEntityGraphs(Collection named for ( NamedEntityGraphDefinition definition : namedEntityGraphs ) { log.debugf( "Applying named entity graph [name=%s, source=%s]", - definition.getRegisteredName(), - definition.getSource() + definition.name(), + definition.source() ); - final RootGraphImplementor graph = definition.getGraphCreator().createEntityGraph( + final RootGraphImplementor graph = definition.graphCreator().createEntityGraph( (entityClass) -> { final ManagedDomainType managedDomainType = managedTypeByClass.get( entityClass ); if ( managedDomainType instanceof EntityDomainType match ) { @@ -518,7 +518,7 @@ private void applyNamedEntityGraphs(Collection named throw new IllegalArgumentException( "Cannot resolve entity name : " + jpaEntityName ); } ); - entityGraphMap.put( definition.getRegisteredName(), graph ); + entityGraphMap.put( definition.name(), graph ); } } @@ -690,8 +690,8 @@ private void populateStaticMetamodel(MetadataImplementor bootMetamodel, Metadata -> injectTypedQueryReference( definition, namedQueryMetamodelClass( definition, context ) ) ); bootMetamodel.visitNamedNativeQueryDefinitions( definition -> injectTypedQueryReference( definition, namedQueryMetamodelClass( definition, context ) ) ); - bootMetamodel.getNamedEntityGraphs().values().stream().filter( (definition) -> definition.getEntityName() != null ).forEach( definition - -> injectEntityGraph( definition, graphMetamodelClass( definition, context ), this ) ); + bootMetamodel.getNamedEntityGraphs().values().stream().filter( (definition) -> definition.entityName() != null ) + .forEach( definition -> injectEntityGraph( definition, graphMetamodelClass( definition, context ), this ) ); } private Class namedQueryMetamodelClass(NamedQueryDefinition definition, MetadataContext context) { @@ -700,7 +700,7 @@ private Class namedQueryMetamodelClass(NamedQueryDefinition definition, Me } private Class graphMetamodelClass(NamedEntityGraphDefinition definition, MetadataContext context) { - return context.metamodelClass( managedTypeByName.get( definition.getEntityName() ) ); + return context.metamodelClass( managedTypeByName.get( definition.entityName() ) ); } public static void addAllowedEnumLiteralsToEnumTypesMap( diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/boot/MetadataBuildingContextTestingImpl.java b/hibernate-testing/src/main/java/org/hibernate/testing/boot/MetadataBuildingContextTestingImpl.java index d5d9374e73d7..cde3f6905fe5 100644 --- a/hibernate-testing/src/main/java/org/hibernate/testing/boot/MetadataBuildingContextTestingImpl.java +++ b/hibernate-testing/src/main/java/org/hibernate/testing/boot/MetadataBuildingContextTestingImpl.java @@ -8,7 +8,7 @@ import org.hibernate.boot.internal.InFlightMetadataCollectorImpl; import org.hibernate.boot.internal.MetadataBuilderImpl; import org.hibernate.boot.internal.RootMappingDefaults; -import org.hibernate.boot.model.TypeDefinitionRegistryStandardImpl; +import org.hibernate.boot.internal.TypeDefinitionRegistryStandardImpl; import org.hibernate.boot.model.naming.ObjectNameNormalizer; import org.hibernate.boot.models.xml.internal.PersistenceUnitMetadataImpl; import org.hibernate.boot.registry.StandardServiceRegistry;