From 522c0b0ed0f2e09cd5deb1b0cc47935835f59fa2 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Wed, 3 Sep 2025 13:14:25 +1000 Subject: [PATCH 1/2] misc cleanups in metamodel stuff including lots of 'var' --- .../internal/MappingModelCreationProcess.java | 36 ++-- .../domain/internal/MappingMetamodelImpl.java | 192 ++++++++---------- .../TupleMappingModelExpressible.java | 6 +- 3 files changed, 108 insertions(+), 126 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/MappingModelCreationProcess.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/MappingModelCreationProcess.java index df3cdd2148c7..651eb66a48ed 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/MappingModelCreationProcess.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/MappingModelCreationProcess.java @@ -35,7 +35,7 @@ public static void process( EntityPersisterConcurrentMap entityPersisterMap, Map collectionPersisterMap, RuntimeModelCreationContext creationContext) { - final MappingModelCreationProcess process = new MappingModelCreationProcess( + final var process = new MappingModelCreationProcess( entityPersisterMap, collectionPersisterMap, creationContext @@ -75,13 +75,13 @@ public SqmFunctionRegistry getSqmFunctionRegistry() { * Instance-level trigger for {@link #process} */ private void execute() { - for ( EntityPersister entityPersister : entityPersisterMap.values() ) { + for ( var entityPersister : entityPersisterMap.values() ) { if ( entityPersister instanceof InFlightEntityMappingType inFlightEntityMappingType ) { inFlightEntityMappingType.linkWithSuperType( this ); } } - for ( EntityPersister entityPersister : entityPersisterMap.values() ) { + for ( var entityPersister : entityPersisterMap.values() ) { currentlyProcessingRole = entityPersister.getEntityName(); if ( entityPersister instanceof InFlightEntityMappingType inFlightEntityMappingType ) { @@ -89,7 +89,7 @@ private void execute() { } } - for ( CollectionPersister collectionPersister : collectionPersisterMap.values() ) { + for ( var collectionPersister : collectionPersisterMap.values() ) { if ( collectionPersister instanceof InFlightCollectionMapping inFlightCollectionMapping ) { inFlightCollectionMapping.prepareMappingModel( this ); } @@ -103,15 +103,15 @@ private void executePostInitCallbacks() { Map exceptions = new HashMap<>(); while ( postInitCallbacks != null && !postInitCallbacks.isEmpty() ) { - // copy to avoid CCME - final ArrayList copy = new ArrayList<>( postInitCallbacks ); + // cope the callback list to avoid CCME + final var callbacks = new ArrayList<>( postInitCallbacks ); - // NOTE : this is *not* the same as the lengths between `copy` and `postInitCallbacks` + // NOTE: this is *not* the same as the lengths between `callbacks` and `postInitCallbacks` boolean anyCompleted = false; //noinspection ForLoopReplaceableByForEach - for ( int i = 0; i < copy.size(); i++ ) { - final PostInitCallbackEntry callbackEntry = copy.get( i ); + for ( int i = 0; i < callbacks.size(); i++ ) { + final var callbackEntry = callbacks.get( i ); try { final boolean completed = callbackEntry.process(); if ( completed ) { @@ -123,14 +123,14 @@ private void executePostInitCallbacks() { catch (Exception e) { if ( e instanceof NonTransientException ) { MAPPING_MODEL_CREATION_MESSAGE_LOGGER.debugf( - "Mapping-model creation encountered non-transient error : %s", + "Mapping-model creation encountered non-transient error: %s", e ); throw e; } exceptions.put( callbackEntry, e ); - final String format = "Mapping-model creation encountered (possibly) transient error : %s"; + final String format = "Mapping-model creation encountered (possibly) transient error: %s"; if ( MAPPING_MODEL_CREATION_MESSAGE_LOGGER.isTraceEnabled() ) { MAPPING_MODEL_CREATION_MESSAGE_LOGGER.tracef( e, format, e ); } @@ -142,7 +142,7 @@ private void executePostInitCallbacks() { if ( !anyCompleted ) { // none of the remaining callbacks could complete fully, this is an error - final StringBuilder buff = new StringBuilder( + final var buff = new StringBuilder( "PostInitCallback queue could not be processed..." ); postInitCallbacks.forEach( @@ -151,9 +151,8 @@ private void executePostInitCallbacks() { ); buff.append( EOL ); - final IllegalStateException illegalStateException = new IllegalStateException( buff.toString() ); - - for ( Map.Entry entry : exceptions.entrySet() ) { + final var illegalStateException = new IllegalStateException( buff.toString() ); + for ( var entry : exceptions.entrySet() ) { illegalStateException.addSuppressed( entry.getValue() ); } throw illegalStateException; @@ -165,10 +164,8 @@ public T processSubPart( String localName, SubPartMappingProducer subPartMappingProducer) { assert currentlyProcessingRole != null; - final String initialRole = currentlyProcessingRole; currentlyProcessingRole = currentlyProcessingRole + '#' + localName; - try { return subPartMappingProducer.produceSubMapping( currentlyProcessingRole, this ); } @@ -196,7 +193,7 @@ public void withForeignKey(ModelPart keyOwner, Consumer co } private void withForeignKey(NavigableRole navigableRole, Consumer consumer) { - final ForeignKeyDescriptor keyDescriptor = keyDescriptorMap.get( navigableRole ); + final var keyDescriptor = keyDescriptorMap.get( navigableRole ); if ( keyDescriptor != null ) { consumer.accept( keyDescriptor ); } @@ -215,9 +212,8 @@ private void withForeignKey(NavigableRole navigableRole, Consumer persistentClass.prepareForMappingModel( context ) ); - - final PersisterFactory persisterFactory = - jpaMetamodel.getServiceRegistry().requireService( PersisterFactory.class ); - final CacheImplementor cache = context.getCache(); + bootModel.getMappedSuperclassMappingsCopy() + .forEach( MappedSuperclass::prepareForMappingModel ); + bootModel.getEntityBindings() + .forEach( persistentClass -> persistentClass.prepareForMappingModel( context ) ); + + final var persisterFactory = + jpaMetamodel.getServiceRegistry() + .requireService( PersisterFactory.class ); + final var cache = context.getCache(); processBootEntities( bootModel.getEntityBindings(), cache, @@ -168,12 +165,12 @@ public void finishInitialization(RuntimeModelCreationContext context) { MappingModelCreationProcess.process( entityPersisterMap, collectionPersisterMap, context ); - for ( EntityPersister persister : entityPersisterMap.values() ) { + for ( var persister : entityPersisterMap.values() ) { persister.postInstantiate(); registerEntityNameResolvers( persister, entityNameResolvers ); } - for ( EntityPersister persister : entityPersisterMap.values() ) { + for ( var persister : entityPersisterMap.values() ) { persister.prepareLoaders(); } @@ -181,7 +178,7 @@ public void finishInitialization(RuntimeModelCreationContext context) { registerEmbeddableMappingType( bootModel ); - final Map settings = context.getSettings(); + final var settings = context.getSettings(); jpaMetamodel.processJpa( bootModel, this, @@ -196,8 +193,8 @@ public void finishInitialization(RuntimeModelCreationContext context) { private void registerEmbeddableMappingType(MetadataImplementor bootModel) { bootModel.visitRegisteredComponents( composite -> { - final ComponentType compositeType = (ComponentType) composite.getType(); - final EmbeddableValuedModelPart mappingModelPart = compositeType.getMappingModelPart(); + final var compositeType = (ComponentType) composite.getType(); + final var mappingModelPart = compositeType.getMappingModelPart(); embeddableValuedModelPart.put( mappingModelPart.getNavigableRole(), mappingModelPart ); } ); @@ -205,58 +202,49 @@ private void registerEmbeddableMappingType(MetadataImplementor bootModel) { private void processBootEntities( java.util.Collection entityBindings, - CacheImplementor cacheImplementor, + CacheImplementor cache, PersisterFactory persisterFactory, RuntimeModelCreationContext modelCreationContext) { - for ( final PersistentClass model : entityBindings ) { - final NavigableRole rootEntityRole = new NavigableRole( model.getRootClass().getEntityName() ); - final EntityPersister entityPersister = + for ( final var model : entityBindings ) { + final var rootEntityRole = new NavigableRole( model.getRootClass().getEntityName() ); + final var entityPersister = persisterFactory.createEntityPersister( model, - cacheImplementor.getEntityRegionAccess( rootEntityRole ), - cacheImplementor.getNaturalIdCacheRegionAccessStrategy( rootEntityRole ), + cache.getEntityRegionAccess( rootEntityRole ), + cache.getNaturalIdCacheRegionAccessStrategy( rootEntityRole ), modelCreationContext ); - entityPersisterMap.put( model.getEntityName(), entityPersister ); + final String entityName = model.getEntityName(); + entityPersisterMap.put( entityName, entityPersister ); // Also register the persister under the class name if available, // otherwise the getEntityDescriptor(Class) won't work for entities with custom entity names - if ( model.getClassName() != null && !model.getClassName().equals( model.getEntityName() ) ) { + final String className = model.getClassName(); + if ( className != null && !className.equals( entityName ) ) { // But only if the class name is not registered already, // as we can have the same class mapped to multiple entity names - entityPersisterMap.putIfAbsent( model.getClassName(), entityPersister ); + entityPersisterMap.putIfAbsent( className, entityPersister ); } - if ( entityPersister.getConcreteProxyClass() != null - && entityPersister.getConcreteProxyClass().isInterface() - // we exclude Map based proxy interfaces here because that should indicate MAP entity mode - && !Map.class.isAssignableFrom( entityPersister.getConcreteProxyClass() ) - && entityPersister.getMappedClass() != entityPersister.getConcreteProxyClass() ) { - - if ( entityPersister.getMappedClass().equals( entityPersister.getConcreteProxyClass() ) ) { - // This part handles an odd case in the Hibernate test suite where we map an interface - // as the class and the proxy. I cannot think of a real-life use case for this. - if ( log.isDebugEnabled() ) { - log.debugf( "Entity [%s] mapped same interface [%s] as class and proxy", - entityPersister.getEntityName(), entityPersister.getMappedClass() ); - } - } - else { - final String existing = - entityProxyInterfaceMap.put( - entityPersister.getConcreteProxyClass(), - entityPersister.getEntityName() - ); - if ( existing != null ) { - throw new HibernateException( - String.format( - Locale.ENGLISH, - "Multiple entities [%s, %s] named the same interface [%s] as their proxy which is not supported", - existing, - entityPersister.getEntityName(), - entityPersister.getConcreteProxyClass().getName() - ) - ); - } + final var concreteProxyClass = entityPersister.getConcreteProxyClass(); + final var mappedClass = entityPersister.getMappedClass(); + if ( concreteProxyClass != null + && concreteProxyClass.isInterface() + // we exclude Map-based proxy interfaces here because that should indicate MAP entity mode + && !Map.class.isAssignableFrom( concreteProxyClass ) + && mappedClass != concreteProxyClass ) { + final String existing = + entityProxyInterfaceMap.put( concreteProxyClass, + entityPersister.getEntityName() ); + if ( existing != null ) { + throw new HibernateException( + String.format( + Locale.ENGLISH, + "Multiple entities [%s, %s] named the same interface [%s] as their proxy which is not supported", + existing, + entityPersister.getEntityName(), + concreteProxyClass.getName() + ) + ); } } } @@ -267,15 +255,15 @@ private void processBootCollections( CacheImplementor cacheImplementor, PersisterFactory persisterFactory, RuntimeModelCreationContext modelCreationContext) { - for ( final Collection model : collectionBindings ) { - final NavigableRole navigableRole = new NavigableRole( model.getRole() ); - final CollectionPersister persister = + for ( final var model : collectionBindings ) { + final String role = model.getRole(); + final var persister = persisterFactory.createCollectionPersister( model, - cacheImplementor.getCollectionRegionAccess( navigableRole ), + cacheImplementor.getCollectionRegionAccess( new NavigableRole( role ) ), modelCreationContext ); - collectionPersisterMap.put( model.getRole(), persister ); + collectionPersisterMap.put( role, persister ); if ( persister.getIndexType() instanceof org.hibernate.type.EntityType entityType ) { registerEntityParticipant( entityType, persister ); } @@ -294,8 +282,9 @@ private void registerEntityParticipant(org.hibernate.type.EntityType entityType, private static void registerEntityNameResolvers( EntityPersister persister, Set entityNameResolvers) { - if ( persister.getRepresentationStrategy() != null ) { - registerEntityNameResolvers( persister.getRepresentationStrategy(), entityNameResolvers ); + final var representationStrategy = persister.getRepresentationStrategy(); + if ( representationStrategy != null ) { + registerEntityNameResolvers( representationStrategy, entityNameResolvers ); } } @@ -321,7 +310,7 @@ public ServiceRegistry getServiceRegistry() { @Override public void forEachEntityDescriptor(Consumer action) { - for ( EntityPersister value : entityPersisterMap.values() ) { + for ( var value : entityPersisterMap.values() ) { action.accept( value ); } } @@ -333,7 +322,7 @@ public Stream streamEntityDescriptors() { @Override public EntityPersister getEntityDescriptor(String entityName) { - final EntityPersister entityPersister = entityPersisterMap.get( entityName ); + final var entityPersister = entityPersisterMap.get( entityName ); if ( entityPersister == null ) { throw new UnknownEntityTypeException( entityName ); } @@ -347,7 +336,7 @@ public EntityPersister getEntityDescriptor(NavigableRole name) { @Override public EmbeddableValuedModelPart getEmbeddableValuedModelPart(NavigableRole role){ - final EmbeddableValuedModelPart embeddableMappingType = embeddableValuedModelPart.get( role ); + final var embeddableMappingType = embeddableValuedModelPart.get( role ); if ( embeddableMappingType == null ) { throw new IllegalArgumentException( "Unable to locate EmbeddableValuedModelPart: " + role ); } @@ -371,35 +360,31 @@ public boolean isEntityClass(Class entityJavaType) { @Override public EntityPersister getEntityDescriptor(Class entityJavaType) { - EntityPersister entityPersister = entityPersisterMap.get( entityJavaType.getName() ); + var entityPersister = entityPersisterMap.get( entityJavaType.getName() ); if ( entityPersister == null ) { final String mappedEntityName = entityProxyInterfaceMap.get( entityJavaType ); if ( mappedEntityName != null ) { entityPersister = entityPersisterMap.get( mappedEntityName ); } } - if ( entityPersister == null ) { throw new UnknownEntityTypeException( entityJavaType ); } - return entityPersister; } @Override @Deprecated(forRemoval = true) @SuppressWarnings( "removal" ) public EntityPersister locateEntityDescriptor(Class byClass) { - EntityPersister entityPersister = entityPersisterMap.get( byClass.getName() ); + var entityPersister = entityPersisterMap.get( byClass.getName() ); if ( entityPersister == null ) { final String mappedEntityName = entityProxyInterfaceMap.get( byClass ); if ( mappedEntityName != null ) { entityPersister = entityPersisterMap.get( mappedEntityName ); } } - if ( entityPersister == null ) { throw new UnknownEntityTypeException( byClass ); } - return entityPersister; } @@ -536,7 +521,7 @@ public Stream streamCollectionDescriptors() { @Override public CollectionPersister getCollectionDescriptor(String role) { - final CollectionPersister collectionPersister = collectionPersisterMap.get( role ); + final var collectionPersister = collectionPersisterMap.get( role ); if ( collectionPersister == null ) { throw new IllegalArgumentException( "Unable to locate persister: " + role ); } @@ -567,12 +552,14 @@ public MappingModelExpressible resolveMappingExpressible( instanceof MappingModelExpressible mappingExpressible ) { return mappingExpressible; } - final NavigablePath navigablePath = sqmPath.getNavigablePath(); - if ( navigablePath.getParent() != null ) { - final TableGroup parentTableGroup = tableGroupLocator.apply( navigablePath.getParent() ); - return parentTableGroup.getModelPart().findSubPart( navigablePath.getLocalName(), null ); + else { + final var navigablePath = sqmPath.getNavigablePath(); + final var parent = navigablePath.getParent(); + final var parentTableGroupModelPart = tableGroupLocator.apply( parent ).getModelPart(); + return parent == null + ? parentTableGroupModelPart + : parentTableGroupModelPart.findSubPart( navigablePath.getLocalName(), null ); } - return tableGroupLocator.apply( navigablePath.getParent() ).getModelPart(); } else if ( sqmExpressible instanceof BasicType basicType ) { @@ -604,31 +591,27 @@ else if ( sqmExpressible instanceof AnonymousTupleSqmPathSource anonymousTupl ); } - else if ( sqmExpressible instanceof EmbeddableTypeImpl ) { - return (MappingModelExpressible) sqmExpressible; - } - else if ( sqmExpressible instanceof EntityDomainType entityDomainType ) { return getEntityDescriptor( entityDomainType.getHibernateEntityName() ); } else if ( sqmExpressible instanceof TupleType tupleType ) { - final MappingModelExpressible mappingModelExpressible = tupleTypeCache.get( sqmExpressible ); + final var mappingModelExpressible = tupleTypeCache.get( sqmExpressible ); if ( mappingModelExpressible != null ) { return mappingModelExpressible; } else { - final MappingModelExpressible[] components = - new MappingModelExpressible[tupleType.componentCount()]; - for ( int i = 0; i < components.length; i++ ) { + final int componentCount = tupleType.componentCount(); + final var components = new MappingModelExpressible[componentCount]; + for ( int i = 0; i < componentCount; i++ ) { components[i] = resolveMappingExpressible( tupleType.get( i ), tableGroupLocator ); } - final MappingModelExpressible createdMappingModelExpressible = + final var tupleMappingModelExpressible = new TupleMappingModelExpressible( components ); - final MappingModelExpressible existingMappingModelExpressible = - tupleTypeCache.putIfAbsent( tupleType, createdMappingModelExpressible ); + final var existingMappingModelExpressible = + tupleTypeCache.putIfAbsent( tupleType, tupleMappingModelExpressible ); return existingMappingModelExpressible == null - ? createdMappingModelExpressible + ? tupleMappingModelExpressible : existingMappingModelExpressible; } } @@ -654,12 +637,12 @@ public String[] getAllEntityNames() { @Override public String[] getAllCollectionRoles() { - return ArrayHelper.toStringArray( collectionPersisterMap.keySet() ); + return toStringArray( collectionPersisterMap.keySet() ); } @Override public BindableType resolveParameterBindType(Class javaType) { - final TypeConfiguration typeConfiguration = getTypeConfiguration(); + final var typeConfiguration = getTypeConfiguration(); final BasicType basicType = typeConfiguration.getBasicTypeForJavaType( javaType ); // For enums, we simply don't know the exact mapping if there is no basic type registered @@ -672,13 +655,13 @@ public BindableType resolveParameterBindType(Class javaType) { return (BindableType) managedType; } - final JavaTypeRegistry javaTypeRegistry = typeConfiguration.getJavaTypeRegistry(); - final JavaType javaType1 = javaTypeRegistry.findDescriptor( javaType ); - if ( javaType1 != null ) { + final var javaTypeRegistry = typeConfiguration.getJavaTypeRegistry(); + final JavaType javaTypeDescriptor = javaTypeRegistry.findDescriptor( javaType ); + if ( javaTypeDescriptor != null ) { final JdbcType recommendedJdbcType = - javaType1.getRecommendedJdbcType( typeConfiguration.getCurrentBaseSqlTypeIndicators() ); + javaTypeDescriptor.getRecommendedJdbcType( typeConfiguration.getCurrentBaseSqlTypeIndicators() ); if ( recommendedJdbcType != null ) { - return typeConfiguration.getBasicTypeRegistry().resolve( javaType1, recommendedJdbcType ); + return typeConfiguration.getBasicTypeRegistry().resolve( javaTypeDescriptor, recommendedJdbcType ); } } @@ -719,7 +702,7 @@ public BindableType resolveParameterBindType(T bindValue) { return null; //createEnumType( (Class) clazz ); } else if ( Serializable.class.isAssignableFrom( clazz ) ) { - final BindableType parameterBindType = resolveParameterBindType( Serializable.class ); + final var parameterBindType = resolveParameterBindType( Serializable.class ); //noinspection unchecked return (BindableType) parameterBindType; } @@ -729,8 +712,11 @@ else if ( Serializable.class.isAssignableFrom( clazz ) ) { } private static Class unproxiedClass(T bindValue) { - final LazyInitializer lazyInitializer = extractLazyInitializer( bindValue ); - final Class result = lazyInitializer != null ? lazyInitializer.getPersistentClass() : bindValue.getClass(); + final var lazyInitializer = extractLazyInitializer( bindValue ); + final var result = + lazyInitializer != null + ? lazyInitializer.getPersistentClass() + : bindValue.getClass(); //noinspection unchecked return (Class) result; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/TupleMappingModelExpressible.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/TupleMappingModelExpressible.java index 945e6b2e31f5..22f1f86b835d 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/TupleMappingModelExpressible.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/TupleMappingModelExpressible.java @@ -15,13 +15,13 @@ /** * @author Christian Beikov */ -public class TupleMappingModelExpressible implements MappingModelExpressible { +public class TupleMappingModelExpressible implements MappingModelExpressible { - private final MappingModelExpressible[] components; + private final MappingModelExpressible[] components; private final JdbcMapping[] mappings; public TupleMappingModelExpressible(MappingModelExpressible[] components) { - this.components = (MappingModelExpressible[]) components; + this.components = components; final ArrayList results = new ArrayList<>(); forEachJdbcType( 0, (index, jdbcMapping) -> results.add( jdbcMapping ) ); this.mappings = results.toArray( new JdbcMapping[0] ); From fb9f213b84cc6d8fb34c3f909d7bb43ea423f9d3 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Wed, 3 Sep 2025 13:14:53 +1000 Subject: [PATCH 2/2] javadoc fixes to Transformer interfaces --- .../org/hibernate/query/TupleTransformer.java | 16 ++++++++-------- .../sql/results/spi/RowTransformer.java | 2 -- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/query/TupleTransformer.java b/hibernate-core/src/main/java/org/hibernate/query/TupleTransformer.java index 84f318120132..1383a651719b 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/TupleTransformer.java +++ b/hibernate-core/src/main/java/org/hibernate/query/TupleTransformer.java @@ -10,15 +10,15 @@ import java.util.List; /** - * Defines some transformation applied to each result of a {@link Query} - * before the results are packaged as a {@link List} and returned to the caller. Each result - * is received as a tuple (that is, as an {@code Object[]}), and may be transformed to - * some other type. + * Defines some transformation applied to each result of a {@link Query} before + * the results are packaged as a {@link List} and returned to the caller. Each + * result is received as a tuple (that is, as an {@code Object[]}), and may be + * transformed to some other type. * - * @implNote Every {@code TupleTransformer} is automatically wrapped in an instance of - * {@link RowTransformerTupleTransformerAdapter}, adapting it to the - * {@link org.hibernate.sql.results.spi.RowTransformer} contract, which is always - * used to actually process the results internally. + * @implNote Every {@code TupleTransformer} is automatically wrapped in an + * instance of {@link RowTransformerTupleTransformerAdapter}, adapting it to + * the {@link org.hibernate.sql.results.spi.RowTransformer} contract, which is + * always used to actually process the results internally. * * @see Query#setTupleTransformer * @see Query#list diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/spi/RowTransformer.java b/hibernate-core/src/main/java/org/hibernate/sql/results/spi/RowTransformer.java index ef4caed3cb97..658a72377bff 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/spi/RowTransformer.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/spi/RowTransformer.java @@ -9,8 +9,6 @@ /** * Defines transformation of a raw row in the domain query result row. * - * E.g. a query might select multiple - * * @see org.hibernate.query.TupleTransformer * * @author Steve Ebersole