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 78df9875eadb..3454689f186c 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 @@ -713,10 +713,11 @@ public static AttributeContainer findColumnOwner( PersistentClass persistentClass, String columnName, MetadataBuildingContext context) { + final InFlightMetadataCollector metadataCollector = context.getMetadataCollector(); PersistentClass current = persistentClass; while ( current != null ) { try { - context.getMetadataCollector().getPhysicalColumnName( current.getTable(), columnName ); + metadataCollector.getPhysicalColumnName( current.getTable(), columnName ); return current; } catch (MappingException me) { @@ -724,7 +725,7 @@ public static AttributeContainer findColumnOwner( } for ( Join join : current.getJoins() ) { try { - context.getMetadataCollector().getPhysicalColumnName( join.getTable(), columnName ); + metadataCollector.getPhysicalColumnName( join.getTable(), columnName ); return join; } catch (MappingException me) { @@ -785,9 +786,8 @@ public static Any buildAnyValue( final AnnotatedColumn firstDiscriminatorColumn = discriminatorColumns.getColumns().get(0); firstDiscriminatorColumn.linkWithValue( discriminatorDescriptor ); - final JavaType discriminatorJavaType = discriminatorDescriptor - .resolve() - .getRelationalJavaType(); + final JavaType discriminatorJavaType = + discriminatorDescriptor.resolve().getRelationalJavaType(); final Map> discriminatorValueMappings = new HashMap<>(); processAnyDiscriminatorValues( @@ -801,7 +801,8 @@ public static Any buildAnyValue( value.setDiscriminatorValueMappings( discriminatorValueMappings ); - final AnyDiscriminatorImplicitValues anyDiscriminatorImplicitValues = property.getDirectAnnotationUsage( AnyDiscriminatorImplicitValues.class ); + final AnyDiscriminatorImplicitValues anyDiscriminatorImplicitValues = + property.getDirectAnnotationUsage( AnyDiscriminatorImplicitValues.class ); if ( anyDiscriminatorImplicitValues != null ) { value.setImplicitDiscriminatorValueStrategy( resolveImplicitDiscriminatorStrategy( anyDiscriminatorImplicitValues, context ) ); } @@ -848,7 +849,6 @@ public static MappedSuperclass getMappedSuperclassOrNull( ClassDetails declaringClass, Map inheritanceStatePerClass, MetadataBuildingContext context) { - boolean retrieve = false; if ( declaringClass != null ) { final InheritanceState inheritanceState = inheritanceStatePerClass.get( declaringClass ); if ( inheritanceState == null ) { @@ -857,16 +857,10 @@ public static MappedSuperclass getMappedSuperclassOrNull( ); } if ( inheritanceState.isEmbeddableSuperclass() ) { - retrieve = true; + return context.getMetadataCollector().getMappedSuperclass( declaringClass.toJavaClass() ); } } - - if ( retrieve ) { - return context.getMetadataCollector().getMappedSuperclass( declaringClass.toJavaClass() ); - } - else { - return null; - } + return null; } public static String getPath(PropertyHolder holder, PropertyData property) { @@ -874,14 +868,14 @@ public static String getPath(PropertyHolder holder, PropertyData property) { } public static Map toAliasTableMap(SqlFragmentAlias[] aliases){ - final Map ret = new HashMap<>(); + final Map result = new HashMap<>(); for ( SqlFragmentAlias aliasAnnotation : aliases ) { final String table = aliasAnnotation.table(); if ( isNotBlank( table ) ) { - ret.put( aliasAnnotation.alias(), table ); + result.put( aliasAnnotation.alias(), table ); } } - return ret; + return result; } public static Map toAliasEntityMap(SqlFragmentAlias[] aliases){ 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 330ed37808c4..b4883f980664 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 @@ -40,7 +40,6 @@ 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 java.util.ArrayList; import java.util.Collections; @@ -71,31 +70,30 @@ public static void bindQuery( MetadataBuildingContext context, boolean isDefault, AnnotationTarget annotationTarget) { - if ( namedQuery == null ) { - return; - } - - final String queryName = namedQuery.name(); - final String queryString = namedQuery.query(); - final Class resultClass = namedQuery.resultClass(); - - if ( queryName.isBlank() ) { - throw new AnnotationException( "Class or package level '@NamedQuery' annotation must specify a 'name'" ); - } + if ( namedQuery != null ) { + final String queryName = namedQuery.name(); + final String queryString = namedQuery.query(); + final Class resultClass = namedQuery.resultClass(); + + if ( queryName.isBlank() ) { + throw new AnnotationException( + "Class or package level '@NamedQuery' annotation must specify a 'name'" ); + } - if ( LOG.isDebugEnabled() ) { - LOG.debugf( "Binding named query: %s => %s", queryName, queryString ); - } + if ( LOG.isDebugEnabled() ) { + LOG.debugf( "Binding named query: %s => %s", queryName, queryString ); + } - final QueryHintDefinition hints = new QueryHintDefinition( queryName, namedQuery.hints() ); - final NamedHqlQueryDefinition queryMapping = - createNamedQueryDefinition( queryName, queryString, resultClass, - hints.determineLockOptions( namedQuery ), hints, annotationTarget ); - if ( isDefault ) { - context.getMetadataCollector().addDefaultQuery( queryMapping ); - } - else { - context.getMetadataCollector().addNamedQuery( queryMapping ); + final QueryHintDefinition hints = new QueryHintDefinition( queryName, namedQuery.hints() ); + final NamedHqlQueryDefinition queryMapping = + createNamedQueryDefinition( queryName, queryString, resultClass, + hints.determineLockOptions( namedQuery ), hints, annotationTarget ); + if ( isDefault ) { + context.getMetadataCollector().addDefaultQuery( queryMapping ); + } + else { + context.getMetadataCollector().addNamedQuery( queryMapping ); + } } } @@ -286,10 +284,29 @@ public static NamedProcedureCallDefinition createStoredProcedure( JpaAnnotations.NAMED_STORED_PROCEDURE_QUERY.createUsage( modelsContext ); nameStoredProcedureQueryAnn.name( builder.getName() ); nameStoredProcedureQueryAnn.procedureName( jdbcCall.callableName ); + nameStoredProcedureQueryAnn.parameters( parametersAsAnnotations( builder, context, jdbcCall ) ); + + final String resultSetMappingName = builder.getResultSetMappingName(); + if ( resultSetMappingName != null ) { + nameStoredProcedureQueryAnn.resultSetMappings( new String[] {resultSetMappingName} ); + } + + final Class resultClass = builder.getResultClass(); + if ( resultClass != null ) { + nameStoredProcedureQueryAnn.resultClasses( new Class[]{ builder.getResultClass() } ); + } + + final List hints = hintsAsAnnotations( builder, modelsContext, jdbcCall ); + nameStoredProcedureQueryAnn.hints( hints.toArray(QueryHint[]::new) ); - final StoredProcedureParameter[] parameters = new StoredProcedureParameter[jdbcCall.parameters.size()]; - nameStoredProcedureQueryAnn.parameters( parameters ); + return new NamedProcedureCallDefinitionImpl( nameStoredProcedureQueryAnn ); + } + private static StoredProcedureParameter[] parametersAsAnnotations( + NamedNativeQueryDefinition.Builder builder, MetadataBuildingContext context, JdbcCall jdbcCall) { + final ModelsContext modelsContext = context.getBootstrapContext().getModelsContext(); + final StoredProcedureParameter[] parameters = + new StoredProcedureParameter[jdbcCall.parameters.size()]; for ( int i = 0; i < jdbcCall.parameters.size(); i++ ) { final StoredProcedureParameterJpaAnnotation param = JpaAnnotations.STORED_PROCEDURE_PARAMETER.createUsage( modelsContext ); @@ -300,32 +317,18 @@ public static NamedProcedureCallDefinition createStoredProcedure( param.mode( ParameterMode.IN ); final String typeName = builder.getParameterTypes().get( paramName ); - final ClassDetails classDetails; - if ( isEmpty( typeName ) ) { - classDetails = ClassDetails.VOID_CLASS_DETAILS; - } - else { - final BasicType registeredType = context.getBootstrapContext() - .getTypeConfiguration() - .getBasicTypeRegistry() - .getRegisteredType( typeName ); - classDetails = context.getMetadataCollector().getClassDetailsRegistry() - .getClassDetails( registeredType.getJavaType().getName() ); - } + final ClassDetails classDetails = + isEmpty( typeName ) + ? ClassDetails.VOID_CLASS_DETAILS + : classDetails( context, typeName ); param.type( classDetails.toJavaClass() ); } + return parameters; + } - if ( builder.getResultSetMappingName() != null ) { - nameStoredProcedureQueryAnn.resultSetMappings( new String[] { builder.getResultSetMappingName() } ); - } - - final Class resultClass = builder.getResultClass(); - if ( resultClass != null ) { - nameStoredProcedureQueryAnn.resultClasses( new Class[]{ builder.getResultClass() } ); - } - - final List hints = new ArrayList<>(); - + private static List hintsAsAnnotations( + NamedNativeQueryDefinition.Builder builder, ModelsContext modelsContext, JdbcCall jdbcCall) { + final List hints = new ArrayList<>(); if ( builder.getQuerySpaces() != null ) { final QueryHintJpaAnnotation hint = JpaAnnotations.QUERY_HINT.createUsage( modelsContext ); @@ -333,7 +336,6 @@ public static NamedProcedureCallDefinition createStoredProcedure( hint.value( String.join( " ", builder.getQuerySpaces() ) ); hints.add( hint ); } - if ( jdbcCall.resultParameter ) { // Mark native queries that have a result parameter as callable functions final QueryHintJpaAnnotation hint = @@ -342,10 +344,15 @@ public static NamedProcedureCallDefinition createStoredProcedure( hint.value( "true" ); hints.add( hint ); } + return hints; + } - nameStoredProcedureQueryAnn.hints( hints.toArray(QueryHint[]::new) ); - - return new NamedProcedureCallDefinitionImpl( nameStoredProcedureQueryAnn ); + private static ClassDetails classDetails(MetadataBuildingContext context, String typeName) { + final String registeredTypeName = + context.getBootstrapContext().getTypeConfiguration().getBasicTypeRegistry() + .getRegisteredType( typeName ).getJavaType().getName(); + return context.getMetadataCollector().getClassDetailsRegistry() + .getClassDetails( registeredTypeName ); } public static void bindQuery( diff --git a/hibernate-core/src/main/java/org/hibernate/internal/util/StringHelper.java b/hibernate-core/src/main/java/org/hibernate/internal/util/StringHelper.java index 16cd1a35b1cb..c0127039985c 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/util/StringHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/util/StringHelper.java @@ -646,6 +646,10 @@ public static String truncate(String string, int length) { return string.length() <= length ? string : string.substring( 0, length ); } + /** + * @deprecated No longer used + */ + @Deprecated(since = "7", forRemoval = true) public static String generateAlias(String description) { return generateAliasRoot( description ) + '_'; } @@ -658,7 +662,10 @@ public static String generateAlias(String description) { * @param unique A uniquing value * * @return an alias of the form foo1_ + * + * @deprecated No longer used */ + @Deprecated(since = "7", forRemoval = true) public static String generateAlias(String description, int unique) { return generateAliasRoot( description ) + AliasConstantsHelper.get( unique ); @@ -672,7 +679,10 @@ public static String generateAlias(String description, int unique) { * @param description The root name from which to generate a root alias. * * @return The generated root alias. + * + * @deprecated No longer used */ + @Deprecated(since = "7", forRemoval = true) private static String generateAliasRoot(String description) { String result = truncate( unqualifyEntityName( description ), ALIAS_TRUNCATE_LENGTH ) .toLowerCase( Locale.ROOT ) @@ -689,7 +699,10 @@ private static String generateAliasRoot(String description) { * @param alias The generated alias to be cleaned. * * @return The cleaned alias, stripped of any leading non-alpha characters. + * + * @deprecated No longer used */ + @Deprecated(since = "7", forRemoval = true) private static String cleanAlias(String alias) { final char[] chars = alias.toCharArray(); // shortcut check... diff --git a/hibernate-core/src/main/java/org/hibernate/loader/internal/AliasConstantsHelper.java b/hibernate-core/src/main/java/org/hibernate/loader/internal/AliasConstantsHelper.java index 8b844fd4bf68..af74349304a5 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/internal/AliasConstantsHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/internal/AliasConstantsHelper.java @@ -18,16 +18,13 @@ public final class AliasConstantsHelper { * is within the range of expected most commonly requested elements. */ public static String get(final int i) { - if ( i < MAX_POOL_SIZE && i >= 0 ) { - return pool[i]; - } - else { - return internalAlias( i ); - } + return i < MAX_POOL_SIZE && i >= 0 + ? pool[i] + : internalAlias( i ); } private static String[] initPool(final int maxPoolSize) { - String[] pool = new String[maxPoolSize]; + final String[] pool = new String[maxPoolSize]; for ( int i = 0; i < maxPoolSize; i++ ) { pool[i] = internalAlias( i ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/DiscriminatorConverter.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/DiscriminatorConverter.java index 22e46cd4983a..089a00922c3a 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/DiscriminatorConverter.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/DiscriminatorConverter.java @@ -59,7 +59,7 @@ public O toDomainValue(R relationalForm) { final EntityMappingType indicatedEntity = matchingValueDetails.getIndicatedEntity(); //noinspection unchecked return indicatedEntity.getRepresentationStrategy().getMode() == RepresentationMode.POJO - && indicatedEntity.getEntityName().equals( indicatedEntity.getJavaType().getJavaTypeClass().getName() ) + && indicatedEntity.getEntityName().equals( indicatedEntity.getJavaType().getJavaTypeClass().getName() ) ? (O) indicatedEntity.getJavaType().getJavaTypeClass() : (O) indicatedEntity.getEntityName(); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatorTypeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatorTypeImpl.java index 36e4915f0ce9..ad55382803c9 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatorTypeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatorTypeImpl.java @@ -41,15 +41,13 @@ public BasicType getUnderlyingJdbcMapping() { return underlyingJdbcMapping; } - @SuppressWarnings("rawtypes") - @Override - public DiscriminatorConverter getValueConverter() { - return (DiscriminatorConverter) super.getValueConverter(); + @Override @SuppressWarnings("unchecked") + public DiscriminatorConverter getValueConverter() { + return (DiscriminatorConverter) super.getValueConverter(); } - @SuppressWarnings({ "rawtypes", "unchecked" }) @Override - public Class getJavaType() { + public Class getJavaType() { return domainJavaType.getJavaTypeClass(); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java index d9257a05d382..469e0a928c37 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java @@ -14,13 +14,13 @@ import org.hibernate.mapping.PersistentClass; import org.hibernate.metamodel.UnsupportedMappingException; +import org.hibernate.metamodel.mapping.DiscriminatorType; import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping; import org.hibernate.metamodel.mapping.EntityIdentifierMapping; import org.hibernate.metamodel.model.domain.IdentifiableDomainType; import org.hibernate.metamodel.model.domain.JpaMetamodel; import org.hibernate.metamodel.model.domain.PersistentAttribute; import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor; -import org.hibernate.persister.entity.DiscriminatorMetadata; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.query.PathException; import org.hibernate.query.sqm.SqmPathSource; @@ -28,9 +28,7 @@ import org.hibernate.query.sqm.tree.domain.SqmPath; import org.hibernate.query.sqm.tree.domain.SqmPersistentAttribute; import org.hibernate.query.sqm.tree.domain.SqmSingularPersistentAttribute; -import org.hibernate.query.sqm.tree.domain.SqmDomainType; import org.hibernate.query.sqm.tree.domain.SqmEntityDomainType; -import org.hibernate.type.StandardBasicTypes; import org.hibernate.type.descriptor.java.JavaType; import static org.hibernate.metamodel.model.domain.internal.DomainModelHelper.isCompatible; @@ -71,16 +69,15 @@ public EntityTypeImpl( this.jpaEntityName = jpaEntityName; this.metamodel = metamodel; + discriminatorPathSource = entityDiscriminatorPathSource( metamodel ); + } + + private EntityDiscriminatorSqmPathSource entityDiscriminatorPathSource(JpaMetamodelImplementor metamodel) { final EntityPersister entityDescriptor = metamodel.getMappingMetamodel() .getEntityDescriptor( getHibernateEntityName() ); - final DiscriminatorMetadata discriminatorMetadata = entityDescriptor.getTypeDiscriminatorMetadata(); - final SqmDomainType discriminatorType = - discriminatorMetadata != null - ? (SqmDomainType) discriminatorMetadata.getResolutionType() - : metamodel.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.STRING ); - - discriminatorPathSource = discriminatorType == null ? null + final DiscriminatorType discriminatorType = entityDescriptor.getDiscriminatorDomainType(); + return discriminatorType == null ? null : new EntityDiscriminatorSqmPathSource<>( discriminatorType, this, entityDescriptor ); } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index 7791f06ffc7a..8834f05520e9 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -125,7 +125,6 @@ import org.hibernate.metamodel.mapping.AttributeMapping; import org.hibernate.metamodel.mapping.AttributeMappingsList; import org.hibernate.metamodel.mapping.AttributeMappingsMap; -import org.hibernate.metamodel.mapping.DiscriminatorConverter; import org.hibernate.metamodel.mapping.DiscriminatorType; import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart; import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping; @@ -252,7 +251,6 @@ import org.hibernate.type.Type; import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.java.MutabilityPlan; -import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry; import org.hibernate.type.spi.TypeConfiguration; import java.io.Serializable; @@ -2204,60 +2202,53 @@ public String[] getPropertyColumnNames(String propertyName) { return propertyMapping.getColumnNames( propertyName ); } - private DiscriminatorType discriminatorType; + private DiscriminatorType discriminatorDomainType; - protected DiscriminatorType resolveDiscriminatorType() { - if ( discriminatorType == null ) { - discriminatorType = buildDiscriminatorType(); + @Override + public DiscriminatorType getDiscriminatorDomainType() { + if ( discriminatorDomainType == null ) { + discriminatorDomainType = buildDiscriminatorType(); } - return discriminatorType; + return discriminatorDomainType; } private DiscriminatorType buildDiscriminatorType() { - final BasicType underlingJdbcMapping = getDiscriminatorType(); - if ( underlingJdbcMapping == null ) { - return null; - } - - final JavaTypeRegistry javaTypeRegistry = factory.getTypeConfiguration().getJavaTypeRegistry(); - - final JavaType domainJavaType; - if ( representationStrategy.getMode() == POJO - && getEntityName().equals( getJavaType().getJavaTypeClass().getName() ) ) { - domainJavaType = javaTypeRegistry.resolveDescriptor( Class.class ); - } - else { - domainJavaType = javaTypeRegistry.resolveDescriptor( String.class ); - } - - //noinspection rawtypes - final DiscriminatorConverter converter = new UnifiedAnyDiscriminatorConverter<>( - getNavigableRole().append( EntityDiscriminatorMapping.DISCRIMINATOR_ROLE_NAME ), - domainJavaType, - underlingJdbcMapping.getRelationalJavaType(), - getSubclassByDiscriminatorValue(), - null, - factory.getMappingMetamodel() - ); - - //noinspection unchecked,rawtypes - return new DiscriminatorTypeImpl( underlingJdbcMapping, converter ); + final BasicType underlyingJdbcMapping = getDiscriminatorType(); + return underlyingJdbcMapping == null + ? null + : new DiscriminatorTypeImpl<>( + underlyingJdbcMapping, + new UnifiedAnyDiscriminatorConverter<>( + getNavigableRole() + .append( EntityDiscriminatorMapping.DISCRIMINATOR_ROLE_NAME ), + factory.getTypeConfiguration().getJavaTypeRegistry() + .resolveDescriptor( discriminatedType() ), + underlyingJdbcMapping.getRelationalJavaType(), + getSubclassByDiscriminatorValue(), + null, + factory.getMappingMetamodel() + ) + ); } - @Override - public DiscriminatorMetadata getTypeDiscriminatorMetadata() { - return this::buildDiscriminatorType; + private Class discriminatedType() { + return representationStrategy.getMode() == POJO + && getEntityName().equals( getJavaType().getJavaTypeClass().getName() ) + ? Class.class + : String.class; } public static String generateTableAlias(String rootAlias, int tableNumber) { if ( tableNumber == 0 ) { return rootAlias; } - final StringBuilder alias = new StringBuilder().append( rootAlias ); - if ( !rootAlias.endsWith( "_" ) ) { - alias.append( '_' ); + else { + final var alias = new StringBuilder().append( rootAlias ); + if ( !rootAlias.endsWith( "_" ) ) { + alias.append( '_' ); + } + return alias.append( tableNumber ).append( '_' ).toString(); } - return alias.append( tableNumber ).append( '_' ).toString(); } private int getSubclassPropertyIndex(String propertyName) { @@ -5036,7 +5027,7 @@ protected EntityDiscriminatorMapping generateDiscriminatorMapping(PersistentClas length, precision, scale, - (DiscriminatorType) getTypeDiscriminatorMetadata().getResolutionType() + getDiscriminatorDomainType() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/DiscriminatorMetadata.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/DiscriminatorMetadata.java index ee3d04aebe4a..a2f21f09deb2 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/DiscriminatorMetadata.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/DiscriminatorMetadata.java @@ -3,6 +3,7 @@ * Copyright Red Hat Inc. and Hibernate Authors */ package org.hibernate.persister.entity; + import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping; import org.hibernate.metamodel.mapping.DiscriminatorConverter; import org.hibernate.type.MetaType; diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/EntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/EntityPersister.java index c35453ee5d9b..9bb01a8b1610 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/EntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/EntityPersister.java @@ -40,11 +40,11 @@ import org.hibernate.id.IdentifierGenerator; import org.hibernate.internal.FilterAliasGenerator; import org.hibernate.internal.TableGroupFilterAliasGenerator; -import org.hibernate.internal.util.StringHelper; import org.hibernate.loader.ast.spi.MultiIdLoadOptions; import org.hibernate.loader.ast.spi.MultiNaturalIdLoader; import org.hibernate.loader.ast.spi.NaturalIdLoader; import org.hibernate.metamodel.mapping.AttributeMapping; +import org.hibernate.metamodel.mapping.DiscriminatorType; import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.ModelPart; @@ -67,6 +67,8 @@ import org.hibernate.type.Type; import org.hibernate.type.descriptor.java.VersionJavaType; +import static org.hibernate.internal.util.StringHelper.unqualifyEntityName; + /** * A strategy for persisting a mapped {@linkplain jakarta.persistence.Entity * entity class}. An {@code EntityPersister} orchestrates rendering of the @@ -189,7 +191,10 @@ default String getSqlAliasStem() { String getJpaEntityName(); default String getImportedName() { - return getJpaEntityName() != null ? getJpaEntityName() : StringHelper.unqualifyEntityName( getEntityName() ); + final String entityName = getJpaEntityName(); + return entityName == null + ? unqualifyEntityName( getEntityName() ) + : entityName; } /** @@ -1497,13 +1502,29 @@ default String getSelectByUniqueKeyString(String[] propertyNames) { */ String selectFragment(String alias, String suffix); + /** + * The type of the discriminator, or {@code null} if the entity does not have a discriminator. + * + * @return a {@link DiscriminatorType} or {@code null} + * + * @see #getDiscriminatorType() + * + * @since 7 + */ + DiscriminatorType getDiscriminatorDomainType(); + /** * Retrieve the information needed to properly deal with this entity's discriminator * in a query. * * @return The entity discriminator metadata + * + * @deprecated Since {@link DiscriminatorMetadata} is deprecated */ - DiscriminatorMetadata getTypeDiscriminatorMetadata(); + @Deprecated(since = "6.2", forRemoval = true) + default DiscriminatorMetadata getTypeDiscriminatorMetadata() { + return this::getDiscriminatorDomainType; + } /** * Given a property path, return the corresponding column name(s). diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java index 643cae41c500..7e73a464e72a 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java @@ -1084,7 +1084,7 @@ else if ( hasSubclasses() ) { notNullColumnNames, discriminatorValues, discriminatorAbstract, - resolveDiscriminatorType() + getDiscriminatorDomainType() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/EntityTypeLiteral.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/EntityTypeLiteral.java index 2c13d387294a..71735a094610 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/EntityTypeLiteral.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/EntityTypeLiteral.java @@ -31,7 +31,7 @@ public class EntityTypeLiteral public EntityTypeLiteral(EntityPersister entityTypeDescriptor) { this.entityTypeDescriptor = entityTypeDescriptor; - this.discriminatorType = (DiscriminatorType) entityTypeDescriptor.getTypeDiscriminatorMetadata().getResolutionType(); + this.discriminatorType = entityTypeDescriptor.getDiscriminatorDomainType(); } public EntityPersister getEntityTypeDescriptor() { @@ -42,7 +42,7 @@ public EntityPersister getEntityTypeDescriptor() { // BasicValuedMapping @Override - public MappingModelExpressible getExpressionType() { + public MappingModelExpressible getExpressionType() { return this; } @@ -141,7 +141,7 @@ public void accept(SqlAstWalker sqlTreeWalker) { } @Override - public JavaType getExpressibleJavaType() { + public JavaType getExpressibleJavaType() { return discriminatorType.getExpressibleJavaType(); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/cfg/persister/GoofyPersisterClassProvider.java b/hibernate-core/src/test/java/org/hibernate/orm/test/cfg/persister/GoofyPersisterClassProvider.java index 142df17c186c..e9ad7a21e4e2 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/cfg/persister/GoofyPersisterClassProvider.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/cfg/persister/GoofyPersisterClassProvider.java @@ -45,6 +45,7 @@ import org.hibernate.metamodel.mapping.AttributeMapping; import org.hibernate.metamodel.mapping.AttributeMappingsList; import org.hibernate.metamodel.mapping.AttributeMappingsMap; +import org.hibernate.metamodel.mapping.DiscriminatorType; import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping; import org.hibernate.metamodel.mapping.EntityIdentifierMapping; import org.hibernate.metamodel.mapping.EntityMappingType; @@ -59,7 +60,6 @@ import org.hibernate.metamodel.spi.EntityRepresentationStrategy; import org.hibernate.metamodel.spi.RuntimeModelCreationContext; import org.hibernate.persister.collection.CollectionPersister; -import org.hibernate.persister.entity.DiscriminatorMetadata; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.persister.entity.UniqueKeyEntry; import org.hibernate.persister.entity.mutation.DeleteCoordinator; @@ -929,7 +929,7 @@ public String selectFragment(String alias, String suffix) { } @Override - public DiscriminatorMetadata getTypeDiscriminatorMetadata() { + public DiscriminatorType getDiscriminatorDomainType() { return null; } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/ejb3configuration/PersisterClassProviderTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/ejb3configuration/PersisterClassProviderTest.java index 7eac16cb6a3c..23545af29035 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/ejb3configuration/PersisterClassProviderTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/ejb3configuration/PersisterClassProviderTest.java @@ -43,6 +43,7 @@ import org.hibernate.metamodel.mapping.AttributeMapping; import org.hibernate.metamodel.mapping.AttributeMappingsList; import org.hibernate.metamodel.mapping.AttributeMappingsMap; +import org.hibernate.metamodel.mapping.DiscriminatorType; import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping; import org.hibernate.metamodel.mapping.EntityIdentifierMapping; import org.hibernate.metamodel.mapping.EntityMappingType; @@ -58,7 +59,6 @@ import org.hibernate.metamodel.spi.RuntimeModelCreationContext; import org.hibernate.orm.test.jpa.SettingsGenerator; import org.hibernate.persister.collection.CollectionPersister; -import org.hibernate.persister.entity.DiscriminatorMetadata; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.persister.entity.UniqueKeyEntry; import org.hibernate.persister.entity.mutation.DeleteCoordinator; @@ -955,7 +955,7 @@ public String selectFragment(String alias, String suffix) { } @Override - public DiscriminatorMetadata getTypeDiscriminatorMetadata() { + public DiscriminatorType getDiscriminatorDomainType() { return null; } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/legacy/CustomPersister.java b/hibernate-core/src/test/java/org/hibernate/orm/test/legacy/CustomPersister.java index 3467157f651a..dcf97609cf70 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/legacy/CustomPersister.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/legacy/CustomPersister.java @@ -44,6 +44,7 @@ import org.hibernate.metamodel.mapping.AttributeMapping; import org.hibernate.metamodel.mapping.AttributeMappingsList; import org.hibernate.metamodel.mapping.AttributeMappingsMap; +import org.hibernate.metamodel.mapping.DiscriminatorType; import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping; import org.hibernate.metamodel.mapping.EntityIdentifierMapping; import org.hibernate.metamodel.mapping.EntityMappingType; @@ -57,7 +58,6 @@ import org.hibernate.metamodel.model.domain.NavigableRole; import org.hibernate.metamodel.spi.EntityRepresentationStrategy; import org.hibernate.metamodel.spi.RuntimeModelCreationContext; -import org.hibernate.persister.entity.DiscriminatorMetadata; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.persister.entity.UniqueKeyEntry; import org.hibernate.persister.entity.mutation.DeleteCoordinator; @@ -1063,7 +1063,7 @@ public String selectFragment(String alias, String suffix) { } @Override - public DiscriminatorMetadata getTypeDiscriminatorMetadata() { + public DiscriminatorType getDiscriminatorDomainType() { return null; } diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockEntityPersister.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockEntityPersister.java index fb34ab3c4e0d..940df2e4ae07 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockEntityPersister.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockEntityPersister.java @@ -6,7 +6,12 @@ import jakarta.persistence.AccessType; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.persister.entity.DiscriminatorMetadata; +import org.hibernate.metamodel.internal.ShortNameImplicitDiscriminatorStrategy; +import org.hibernate.metamodel.mapping.DiscriminatorType; +import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping; +import org.hibernate.metamodel.mapping.internal.DiscriminatorTypeImpl; +import org.hibernate.metamodel.mapping.internal.UnifiedAnyDiscriminatorConverter; +import org.hibernate.metamodel.model.domain.NavigableRole; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.persister.entity.Joinable; import org.hibernate.tuple.entity.EntityMetamodel; @@ -22,11 +27,13 @@ import java.util.Objects; import java.util.Set; +import static java.util.Collections.emptyMap; + /** * @author Gavin King */ @SuppressWarnings("nullness") -public abstract class MockEntityPersister implements EntityPersister, Joinable, DiscriminatorMetadata { +public abstract class MockEntityPersister implements EntityPersister, Joinable { private static final String[] ID_COLUMN = {"id"}; @@ -189,13 +196,20 @@ public String[] getIdentifierColumnNames() { } @Override - public DiscriminatorMetadata getTypeDiscriminatorMetadata() { - return this; - } - - @Override - public Type getResolutionType() { - return factory.getTypeConfiguration().getBasicTypeForJavaType(Class.class); + public DiscriminatorType getDiscriminatorDomainType() { + var type = getDiscriminatorType(); + return new DiscriminatorTypeImpl<>( + type, + new UnifiedAnyDiscriminatorConverter<>( + new NavigableRole( entityName ) + .append( EntityDiscriminatorMapping.DISCRIMINATOR_ROLE_NAME ), + type.getJavaTypeDescriptor(), + type.getRelationalJavaType(), + emptyMap(), + ShortNameImplicitDiscriminatorStrategy.SHORT_NAME_STRATEGY, + factory.getMetamodel() + ) + ); } @Override @@ -224,7 +238,7 @@ public String getMappedSuperclass() { } @Override - public Type getDiscriminatorType() { + public BasicType getDiscriminatorType() { return factory.getTypeConfiguration().getBasicTypeForJavaType(String.class); } diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java index ff5432f186ed..c15d430ab8e7 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java @@ -53,7 +53,6 @@ import org.hibernate.metamodel.CollectionClassification; import org.hibernate.metamodel.internal.JpaMetamodelPopulationSetting; import org.hibernate.metamodel.internal.JpaStaticMetamodelPopulationSetting; -import org.hibernate.metamodel.MappingMetamodel; import org.hibernate.metamodel.internal.MetadataContext; import org.hibernate.metamodel.mapping.EntityIdentifierMapping; import org.hibernate.metamodel.mapping.JdbcMapping; @@ -383,7 +382,7 @@ public Type getReferencedPropertyType(String className, String propertyName) } @Override - public MappingMetamodel getMetamodel() { + public MappingMetamodelImplementor getMetamodel() { return metamodel; }