diff --git a/hibernate-core/src/main/java/org/hibernate/boot/MetadataBuilder.java b/hibernate-core/src/main/java/org/hibernate/boot/MetadataBuilder.java index c09e7fe22d53..12710b61aa11 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/MetadataBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/MetadataBuilder.java @@ -4,7 +4,6 @@ */ package org.hibernate.boot; -import org.hibernate.Incubating; import org.hibernate.boot.archive.scan.spi.ScanEnvironment; import org.hibernate.boot.archive.scan.spi.ScanOptions; import org.hibernate.boot.archive.scan.spi.Scanner; @@ -276,19 +275,6 @@ public interface MetadataBuilder { */ MetadataBuilder enableGlobalNationalizedCharacterDataSupport(boolean enabled); - /** - * Specify whether missing {@link jakarta.persistence.MapsId} annotations - * should be inferred. - * - * @param enabled {@code true} if missing {@code MapsId} should be inferred - * - * @return {@code this}, for method chaining - * - * @since 7.0 - */ - @Incubating - MetadataBuilder enableMapsIdInference(boolean enabled); - /** * Specify an additional or overridden basic type mapping. * 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 fef12c207ded..0ac4fcfe5a42 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 @@ -1372,16 +1372,6 @@ public void addPropertyAnnotatedWithMapsId(ClassDetails entityType, PropertyData .put( property.getAttributeMember().getDirectAnnotationUsage( MapsId.class ).value(), property ); } - @Override - public void addInferredMapsIdProperty(ClassDetails entityType, PropertyData property, String mapsIdValue) { - if ( propertiesAnnotatedWithMapsId == null ) { - propertiesAnnotatedWithMapsId = new HashMap<>(); - } - - propertiesAnnotatedWithMapsId.computeIfAbsent( entityType, k -> new HashMap<>() ) - .put( mapsIdValue, property ); - } - @Override public PropertyData getPropertyAnnotatedWithIdAndToOne(ClassDetails entityType, String propertyName) { if ( propertiesAnnotatedWithIdAndToOne == null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java index 6d8827a91298..4f34a0d25fca 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java @@ -343,11 +343,6 @@ public MetadataBuilder applyTempClassLoader(ClassLoader tempClassLoader) { return this; } - public MetadataBuilder enableMapsIdInference(boolean enabled) { - options.mapsIdInferenceEnabled = enabled; - return this; - } - public MetadataBuilder noConstraintByDefault() { options.noConstraintByDefault = true; return this; @@ -644,7 +639,6 @@ public static class MetadataBuildingOptionsImpl private boolean implicitDiscriminatorsForJoinedInheritanceSupported; private boolean implicitlyForceDiscriminatorInSelect; private boolean useNationalizedCharacterData; - private boolean mapsIdInferenceEnabled; private boolean noConstraintByDefault; private final String schemaCharset; @@ -735,12 +729,6 @@ else if ( value instanceof AccessType accessType ) { regionFactory == null ? null : regionFactory.getDefaultAccessType() ); - mapsIdInferenceEnabled = configService.getSetting( - "hibernate.enable_mapsid_inference", - BOOLEAN, - false - ); - noConstraintByDefault = ConstraintMode.NO_CONSTRAINT.name().equalsIgnoreCase( configService.getSetting( AvailableSettings.HBM2DDL_DEFAULT_CONSTRAINT_MODE, String.class, @@ -919,11 +907,6 @@ public boolean useNationalizedCharacterData() { return useNationalizedCharacterData; } - @Override - public boolean isMapsIdInferenceEnabled() { - return mapsIdInferenceEnabled; - } - @Override public boolean isNoConstraintByDefault() { return noConstraintByDefault; diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java index 1fcbfed10e2c..220daac9fc6c 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java @@ -32,7 +32,6 @@ import org.hibernate.annotations.OptimisticLock; import org.hibernate.annotations.Parent; import org.hibernate.binder.AttributeBinder; -import org.hibernate.boot.models.JpaAnnotations; import org.hibernate.boot.spi.AccessType; import org.hibernate.boot.spi.InFlightMetadataCollector; import org.hibernate.boot.spi.MetadataBuildingContext; @@ -67,11 +66,9 @@ import jakarta.persistence.Basic; -import jakarta.persistence.Column; import jakarta.persistence.ElementCollection; import jakarta.persistence.EmbeddedId; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; import jakarta.persistence.Lob; import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; @@ -623,7 +620,6 @@ private static int addProperty( final MemberDetails element = propertyAnnotatedElement.getAttributeMember(); if ( hasIdAnnotation( element ) ) { inFlightPropertyDataList.add( idPropertyCounter, propertyAnnotatedElement ); - handleInferredMapsIdProperty( propertyContainer, context, declaringClass, ownerType, element ); if ( hasToOneAnnotation( element ) ) { context.getMetadataCollector() .addToOneAndIdProperty( ownerType.determineRawClass(), propertyAnnotatedElement ); @@ -653,65 +649,6 @@ private static void checkIdProperty(MemberDetails property, PropertyData propert } } - // The following code infers a "missing" @MapsId annotation when - // an @Id Column matches a @JoinColumn of another field. No test - // fails if I simply remove this code, and, indeed, it was broken - // and doing nothing before I got here. I've now "fixed" it to do - // what it was supposed to be doing, but honestly the semantics - // aren't clear: why should it be linked to the existence of an - // explicit @Column annotation? And there's still no test for it. - // - // The real work is done by ToOneBinder#handleInferredMapsId - private static void handleInferredMapsIdProperty( - PropertyContainer propertyContainer, - MetadataBuildingContext context, - ClassDetails declaringClass, - TypeVariableScope ownerType, - MemberDetails element) { - if ( context.getBuildingOptions().isMapsIdInferenceEnabled() ) { - //TODO support true/false/default on the property instead of present / not present - final SourceModelBuildingContext sourceModelContext = - context.getMetadataCollector().getSourceModelBuildingContext(); - if ( element.hasDirectAnnotationUsage( Id.class ) - //TODO Explicit @Column should not be mandatory here - && element.hasDirectAnnotationUsage( Column.class ) ) { - final String columnName = element.getDirectAnnotationUsage( Column.class ).name(); - declaringClass.forEachPersistableMember( memberDetails -> { - if ( !memberDetails.hasDirectAnnotationUsage( MapsId.class ) - && isJoinColumnPresent( columnName, memberDetails, sourceModelContext ) ) { - //create a PropertyData for the specJ property holding the mapping - context.getMetadataCollector().addInferredMapsIdProperty( - ownerType.determineRawClass(), - new PropertyInferredData( - declaringClass, - ownerType, - //same dec - memberDetails, - // the actual @XToOne property - propertyContainer.getClassLevelAccessType().getType(), - //TODO we should get the right accessor but the same as id would do - context - ), - element.toString() - ); - } - } ); - } - } - } - - private static boolean isJoinColumnPresent(String columnName, MemberDetails property, SourceModelBuildingContext modelContext) { - // The detection of a configured individual JoinColumn differs - // between Annotation and XML configuration processing. - for ( JoinColumn joinColumnAnnotation : - property.getRepeatedAnnotationUsages( JpaAnnotations.JOIN_COLUMN, modelContext ) ) { - if ( joinColumnAnnotation.name().equals( columnName ) ) { - return true; - } - } - return false; - } - static boolean hasIdAnnotation(MemberDetails element) { return element.hasDirectAnnotationUsage( Id.class ) || element.hasDirectAnnotationUsage( EmbeddedId.class ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ToOneBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ToOneBinder.java index 506876d8f5ac..e272a877d9a6 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ToOneBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ToOneBinder.java @@ -53,7 +53,6 @@ import static org.hibernate.boot.model.internal.BinderHelper.noConstraint; import static org.hibernate.internal.CoreLogging.messageLogger; import static org.hibernate.internal.util.StringHelper.isBlank; -import static org.hibernate.internal.util.StringHelper.isNotBlank; import static org.hibernate.internal.util.StringHelper.nullIfEmpty; import static org.hibernate.internal.util.StringHelper.qualify; @@ -214,7 +213,6 @@ private static void bindManyToOne( joinColumns.setMapsId( mapsId.value() ); } - final boolean hasInferredMapsId = handleInferredMapsId( joinColumns, inferredData, property, context ); value.setTypeName( inferredData.getClassOrElementName() ); final String propertyName = inferredData.getPropertyName(); value.setTypeUsingReflection( propertyHolder.getClassName(), propertyName ); @@ -244,7 +242,7 @@ private static void bindManyToOne( joinColumns, optional, inferredData, - isIdentifierMapper || hasInferredMapsId, + isIdentifierMapper, propertyBinder, value, property, @@ -257,48 +255,6 @@ static boolean isTargetAnnotatedEntity(ClassDetails targetEntity, MemberDetails return target.hasDirectAnnotationUsage( Entity.class ); } - // The following code infers a "missing" @MapsId annotation - // when an @Id Column matches a @JoinColumn of another field. - // There's also some related code for this case over in - // PropertyBinder#handleInferredMapsIdProperty - private static boolean handleInferredMapsId( - AnnotatedJoinColumns columns, - PropertyData propertyData, - MemberDetails property, - MetadataBuildingContext context) { - if ( context.getBuildingOptions().isMapsIdInferenceEnabled() ) { - //Make sure that JPA1 key-many-to-one columns are read only too - boolean hasInferredMapsId = false; - final JoinColumn joinColumn = property.getDirectAnnotationUsage( JoinColumn.class ); - if ( joinColumn != null - && property.hasDirectAnnotationUsage( ManyToOne.class ) - && !property.hasDirectAnnotationUsage( MapsId.class ) ) { - final String joinColumnName = joinColumn.name(); - if ( isNotBlank( joinColumnName ) ) { - for ( MemberDetails member : propertyData.getDeclaringClass().getFields() ) { - if ( member.hasDirectAnnotationUsage( Id.class ) - //TODO Explicit @Column should not be mandatory here - && member.hasDirectAnnotationUsage( Column.class ) ) { - final String columnName = member.getDirectAnnotationUsage( Column.class ).name(); - if ( joinColumnName.equals( columnName ) ) { - hasInferredMapsId = true; - for ( AnnotatedJoinColumn column : columns.getJoinColumns() ) { - column.setInsertable( false ); - column.setUpdatable( false ); - } - } - } - } - } - - } - return hasInferredMapsId; - } - else { - return false; - } - } - private static void processManyToOneProperty( String cascadeStrategy, AnnotatedJoinColumns columns, diff --git a/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingMetadataBuilderImplementor.java b/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingMetadataBuilderImplementor.java index 97e8a305d67c..421dc460f0c6 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingMetadataBuilderImplementor.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingMetadataBuilderImplementor.java @@ -149,12 +149,6 @@ public MetadataBuilder enableGlobalNationalizedCharacterDataSupport(boolean enab return getThis(); } - @Override - public MetadataBuilder enableMapsIdInference(boolean enabled) { - delegate.enableMapsIdInference( enabled ); - return getThis(); - } - @Override public MetadataBuilder applyBasicType(BasicType type) { delegate.applyBasicType( type ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingMetadataBuildingOptions.java b/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingMetadataBuildingOptions.java index b13be6b66fa3..2f42cb8ed79d 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingMetadataBuildingOptions.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingMetadataBuildingOptions.java @@ -130,11 +130,6 @@ public boolean useNationalizedCharacterData() { return delegate.useNationalizedCharacterData(); } - @Override - public boolean isMapsIdInferenceEnabled() { - return delegate.isMapsIdInferenceEnabled(); - } - @Override public boolean isNoConstraintByDefault() { return delegate.isNoConstraintByDefault(); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/spi/InFlightMetadataCollector.java b/hibernate-core/src/main/java/org/hibernate/boot/spi/InFlightMetadataCollector.java index c175637e494e..83b62fd194d3 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/spi/InFlightMetadataCollector.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/spi/InFlightMetadataCollector.java @@ -330,7 +330,6 @@ void addTableNameBinding( PropertyData getPropertyAnnotatedWithMapsId(ClassDetails persistentClassDetails, String propertyName); void addPropertyAnnotatedWithMapsId(ClassDetails entityClassDetails, PropertyData propertyAnnotatedElement); - void addInferredMapsIdProperty(ClassDetails entityClassDetails, PropertyData specJPropertyData, String s); void addToOneAndIdProperty(ClassDetails entityClassDetails, PropertyData propertyAnnotatedElement); PropertyData getPropertyAnnotatedWithIdAndToOne(ClassDetails persistentClassDetails, String propertyName); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/spi/MetadataBuildingOptions.java b/hibernate-core/src/main/java/org/hibernate/boot/spi/MetadataBuildingOptions.java index e5d47b5c091b..f98527e28274 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/spi/MetadataBuildingOptions.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/spi/MetadataBuildingOptions.java @@ -205,12 +205,6 @@ default CollectionSemanticsResolver getPersistentCollectionRepresentationResolve */ boolean useNationalizedCharacterData(); - /** - * Do we attempt to infer missing {@link jakarta.persistence.MapsId} - * annotations when they are not explicitly specified? - */ - boolean isMapsIdInferenceEnabled(); - /** * Should we disable constraint creation when * {@link jakarta.persistence.ConstraintMode#PROVIDER_DEFAULT}? diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/derivedidentities/e1/b/specjmapid/CustomerInventory.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/derivedidentities/e1/b/specjmapid/CustomerInventory.java index 536032d78402..1b6820a2f0a9 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/derivedidentities/e1/b/specjmapid/CustomerInventory.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/derivedidentities/e1/b/specjmapid/CustomerInventory.java @@ -17,6 +17,7 @@ import jakarta.persistence.IdClass; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import jakarta.persistence.MapsId; import jakarta.persistence.NamedQueries; import jakarta.persistence.NamedQuery; import jakarta.persistence.Table; @@ -49,6 +50,7 @@ public class CustomerInventory implements Serializable, Comparator