Skip to content

Commit 7532d5e

Browse files
committed
HHH-19018 remove support for inferred @mapsid
1 parent 1f87e47 commit 7532d5e

File tree

12 files changed

+3
-182
lines changed

12 files changed

+3
-182
lines changed

hibernate-core/src/main/java/org/hibernate/boot/MetadataBuilder.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*/
55
package org.hibernate.boot;
66

7-
import org.hibernate.Incubating;
87
import org.hibernate.boot.archive.scan.spi.ScanEnvironment;
98
import org.hibernate.boot.archive.scan.spi.ScanOptions;
109
import org.hibernate.boot.archive.scan.spi.Scanner;
@@ -276,19 +275,6 @@ public interface MetadataBuilder {
276275
*/
277276
MetadataBuilder enableGlobalNationalizedCharacterDataSupport(boolean enabled);
278277

279-
/**
280-
* Specify whether missing {@link jakarta.persistence.MapsId} annotations
281-
* should be inferred.
282-
*
283-
* @param enabled {@code true} if missing {@code MapsId} should be inferred
284-
*
285-
* @return {@code this}, for method chaining
286-
*
287-
* @since 7.0
288-
*/
289-
@Incubating
290-
MetadataBuilder enableMapsIdInference(boolean enabled);
291-
292278
/**
293279
* Specify an additional or overridden basic type mapping.
294280
*

hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1372,16 +1372,6 @@ public void addPropertyAnnotatedWithMapsId(ClassDetails entityType, PropertyData
13721372
.put( property.getAttributeMember().getDirectAnnotationUsage( MapsId.class ).value(), property );
13731373
}
13741374

1375-
@Override
1376-
public void addInferredMapsIdProperty(ClassDetails entityType, PropertyData property, String mapsIdValue) {
1377-
if ( propertiesAnnotatedWithMapsId == null ) {
1378-
propertiesAnnotatedWithMapsId = new HashMap<>();
1379-
}
1380-
1381-
propertiesAnnotatedWithMapsId.computeIfAbsent( entityType, k -> new HashMap<>() )
1382-
.put( mapsIdValue, property );
1383-
}
1384-
13851375
@Override
13861376
public PropertyData getPropertyAnnotatedWithIdAndToOne(ClassDetails entityType, String propertyName) {
13871377
if ( propertiesAnnotatedWithIdAndToOne == null ) {

hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -343,11 +343,6 @@ public MetadataBuilder applyTempClassLoader(ClassLoader tempClassLoader) {
343343
return this;
344344
}
345345

346-
public MetadataBuilder enableMapsIdInference(boolean enabled) {
347-
options.mapsIdInferenceEnabled = enabled;
348-
return this;
349-
}
350-
351346
public MetadataBuilder noConstraintByDefault() {
352347
options.noConstraintByDefault = true;
353348
return this;
@@ -644,7 +639,6 @@ public static class MetadataBuildingOptionsImpl
644639
private boolean implicitDiscriminatorsForJoinedInheritanceSupported;
645640
private boolean implicitlyForceDiscriminatorInSelect;
646641
private boolean useNationalizedCharacterData;
647-
private boolean mapsIdInferenceEnabled;
648642
private boolean noConstraintByDefault;
649643

650644
private final String schemaCharset;
@@ -735,12 +729,6 @@ else if ( value instanceof AccessType accessType ) {
735729
regionFactory == null ? null : regionFactory.getDefaultAccessType()
736730
);
737731

738-
mapsIdInferenceEnabled = configService.getSetting(
739-
"hibernate.enable_mapsid_inference",
740-
BOOLEAN,
741-
false
742-
);
743-
744732
noConstraintByDefault = ConstraintMode.NO_CONSTRAINT.name().equalsIgnoreCase( configService.getSetting(
745733
AvailableSettings.HBM2DDL_DEFAULT_CONSTRAINT_MODE,
746734
String.class,
@@ -919,11 +907,6 @@ public boolean useNationalizedCharacterData() {
919907
return useNationalizedCharacterData;
920908
}
921909

922-
@Override
923-
public boolean isMapsIdInferenceEnabled() {
924-
return mapsIdInferenceEnabled;
925-
}
926-
927910
@Override
928911
public boolean isNoConstraintByDefault() {
929912
return noConstraintByDefault;

hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java

Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.hibernate.annotations.OptimisticLock;
3333
import org.hibernate.annotations.Parent;
3434
import org.hibernate.binder.AttributeBinder;
35-
import org.hibernate.boot.models.JpaAnnotations;
3635
import org.hibernate.boot.spi.AccessType;
3736
import org.hibernate.boot.spi.InFlightMetadataCollector;
3837
import org.hibernate.boot.spi.MetadataBuildingContext;
@@ -67,11 +66,9 @@
6766

6867

6968
import jakarta.persistence.Basic;
70-
import jakarta.persistence.Column;
7169
import jakarta.persistence.ElementCollection;
7270
import jakarta.persistence.EmbeddedId;
7371
import jakarta.persistence.Id;
74-
import jakarta.persistence.JoinColumn;
7572
import jakarta.persistence.Lob;
7673
import jakarta.persistence.ManyToMany;
7774
import jakarta.persistence.ManyToOne;
@@ -623,7 +620,6 @@ private static int addProperty(
623620
final MemberDetails element = propertyAnnotatedElement.getAttributeMember();
624621
if ( hasIdAnnotation( element ) ) {
625622
inFlightPropertyDataList.add( idPropertyCounter, propertyAnnotatedElement );
626-
handleInferredMapsIdProperty( propertyContainer, context, declaringClass, ownerType, element );
627623
if ( hasToOneAnnotation( element ) ) {
628624
context.getMetadataCollector()
629625
.addToOneAndIdProperty( ownerType.determineRawClass(), propertyAnnotatedElement );
@@ -653,65 +649,6 @@ private static void checkIdProperty(MemberDetails property, PropertyData propert
653649
}
654650
}
655651

656-
// The following code infers a "missing" @MapsId annotation when
657-
// an @Id Column matches a @JoinColumn of another field. No test
658-
// fails if I simply remove this code, and, indeed, it was broken
659-
// and doing nothing before I got here. I've now "fixed" it to do
660-
// what it was supposed to be doing, but honestly the semantics
661-
// aren't clear: why should it be linked to the existence of an
662-
// explicit @Column annotation? And there's still no test for it.
663-
//
664-
// The real work is done by ToOneBinder#handleInferredMapsId
665-
private static void handleInferredMapsIdProperty(
666-
PropertyContainer propertyContainer,
667-
MetadataBuildingContext context,
668-
ClassDetails declaringClass,
669-
TypeVariableScope ownerType,
670-
MemberDetails element) {
671-
if ( context.getBuildingOptions().isMapsIdInferenceEnabled() ) {
672-
//TODO support true/false/default on the property instead of present / not present
673-
final SourceModelBuildingContext sourceModelContext =
674-
context.getMetadataCollector().getSourceModelBuildingContext();
675-
if ( element.hasDirectAnnotationUsage( Id.class )
676-
//TODO Explicit @Column should not be mandatory here
677-
&& element.hasDirectAnnotationUsage( Column.class ) ) {
678-
final String columnName = element.getDirectAnnotationUsage( Column.class ).name();
679-
declaringClass.forEachPersistableMember( memberDetails -> {
680-
if ( !memberDetails.hasDirectAnnotationUsage( MapsId.class )
681-
&& isJoinColumnPresent( columnName, memberDetails, sourceModelContext ) ) {
682-
//create a PropertyData for the specJ property holding the mapping
683-
context.getMetadataCollector().addInferredMapsIdProperty(
684-
ownerType.determineRawClass(),
685-
new PropertyInferredData(
686-
declaringClass,
687-
ownerType,
688-
//same dec
689-
memberDetails,
690-
// the actual @XToOne property
691-
propertyContainer.getClassLevelAccessType().getType(),
692-
//TODO we should get the right accessor but the same as id would do
693-
context
694-
),
695-
element.toString()
696-
);
697-
}
698-
} );
699-
}
700-
}
701-
}
702-
703-
private static boolean isJoinColumnPresent(String columnName, MemberDetails property, SourceModelBuildingContext modelContext) {
704-
// The detection of a configured individual JoinColumn differs
705-
// between Annotation and XML configuration processing.
706-
for ( JoinColumn joinColumnAnnotation :
707-
property.getRepeatedAnnotationUsages( JpaAnnotations.JOIN_COLUMN, modelContext ) ) {
708-
if ( joinColumnAnnotation.name().equals( columnName ) ) {
709-
return true;
710-
}
711-
}
712-
return false;
713-
}
714-
715652
static boolean hasIdAnnotation(MemberDetails element) {
716653
return element.hasDirectAnnotationUsage( Id.class )
717654
|| element.hasDirectAnnotationUsage( EmbeddedId.class );

hibernate-core/src/main/java/org/hibernate/boot/model/internal/ToOneBinder.java

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
import static org.hibernate.boot.model.internal.BinderHelper.noConstraint;
5454
import static org.hibernate.internal.CoreLogging.messageLogger;
5555
import static org.hibernate.internal.util.StringHelper.isBlank;
56-
import static org.hibernate.internal.util.StringHelper.isNotBlank;
5756
import static org.hibernate.internal.util.StringHelper.nullIfEmpty;
5857
import static org.hibernate.internal.util.StringHelper.qualify;
5958

@@ -214,7 +213,6 @@ private static void bindManyToOne(
214213
joinColumns.setMapsId( mapsId.value() );
215214
}
216215

217-
final boolean hasInferredMapsId = handleInferredMapsId( joinColumns, inferredData, property, context );
218216
value.setTypeName( inferredData.getClassOrElementName() );
219217
final String propertyName = inferredData.getPropertyName();
220218
value.setTypeUsingReflection( propertyHolder.getClassName(), propertyName );
@@ -244,7 +242,7 @@ private static void bindManyToOne(
244242
joinColumns,
245243
optional,
246244
inferredData,
247-
isIdentifierMapper || hasInferredMapsId,
245+
isIdentifierMapper,
248246
propertyBinder,
249247
value,
250248
property,
@@ -257,48 +255,6 @@ static boolean isTargetAnnotatedEntity(ClassDetails targetEntity, MemberDetails
257255
return target.hasDirectAnnotationUsage( Entity.class );
258256
}
259257

260-
// The following code infers a "missing" @MapsId annotation
261-
// when an @Id Column matches a @JoinColumn of another field.
262-
// There's also some related code for this case over in
263-
// PropertyBinder#handleInferredMapsIdProperty
264-
private static boolean handleInferredMapsId(
265-
AnnotatedJoinColumns columns,
266-
PropertyData propertyData,
267-
MemberDetails property,
268-
MetadataBuildingContext context) {
269-
if ( context.getBuildingOptions().isMapsIdInferenceEnabled() ) {
270-
//Make sure that JPA1 key-many-to-one columns are read only too
271-
boolean hasInferredMapsId = false;
272-
final JoinColumn joinColumn = property.getDirectAnnotationUsage( JoinColumn.class );
273-
if ( joinColumn != null
274-
&& property.hasDirectAnnotationUsage( ManyToOne.class )
275-
&& !property.hasDirectAnnotationUsage( MapsId.class ) ) {
276-
final String joinColumnName = joinColumn.name();
277-
if ( isNotBlank( joinColumnName ) ) {
278-
for ( MemberDetails member : propertyData.getDeclaringClass().getFields() ) {
279-
if ( member.hasDirectAnnotationUsage( Id.class )
280-
//TODO Explicit @Column should not be mandatory here
281-
&& member.hasDirectAnnotationUsage( Column.class ) ) {
282-
final String columnName = member.getDirectAnnotationUsage( Column.class ).name();
283-
if ( joinColumnName.equals( columnName ) ) {
284-
hasInferredMapsId = true;
285-
for ( AnnotatedJoinColumn column : columns.getJoinColumns() ) {
286-
column.setInsertable( false );
287-
column.setUpdatable( false );
288-
}
289-
}
290-
}
291-
}
292-
}
293-
294-
}
295-
return hasInferredMapsId;
296-
}
297-
else {
298-
return false;
299-
}
300-
}
301-
302258
private static void processManyToOneProperty(
303259
String cascadeStrategy,
304260
AnnotatedJoinColumns columns,

hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingMetadataBuilderImplementor.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,6 @@ public MetadataBuilder enableGlobalNationalizedCharacterDataSupport(boolean enab
149149
return getThis();
150150
}
151151

152-
@Override
153-
public MetadataBuilder enableMapsIdInference(boolean enabled) {
154-
delegate.enableMapsIdInference( enabled );
155-
return getThis();
156-
}
157-
158152
@Override
159153
public MetadataBuilder applyBasicType(BasicType<?> type) {
160154
delegate.applyBasicType( type );

hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingMetadataBuildingOptions.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,6 @@ public boolean useNationalizedCharacterData() {
130130
return delegate.useNationalizedCharacterData();
131131
}
132132

133-
@Override
134-
public boolean isMapsIdInferenceEnabled() {
135-
return delegate.isMapsIdInferenceEnabled();
136-
}
137-
138133
@Override
139134
public boolean isNoConstraintByDefault() {
140135
return delegate.isNoConstraintByDefault();

hibernate-core/src/main/java/org/hibernate/boot/spi/InFlightMetadataCollector.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,6 @@ void addTableNameBinding(
330330

331331
PropertyData getPropertyAnnotatedWithMapsId(ClassDetails persistentClassDetails, String propertyName);
332332
void addPropertyAnnotatedWithMapsId(ClassDetails entityClassDetails, PropertyData propertyAnnotatedElement);
333-
void addInferredMapsIdProperty(ClassDetails entityClassDetails, PropertyData specJPropertyData, String s);
334333

335334
void addToOneAndIdProperty(ClassDetails entityClassDetails, PropertyData propertyAnnotatedElement);
336335
PropertyData getPropertyAnnotatedWithIdAndToOne(ClassDetails persistentClassDetails, String propertyName);

hibernate-core/src/main/java/org/hibernate/boot/spi/MetadataBuildingOptions.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -205,12 +205,6 @@ default CollectionSemanticsResolver getPersistentCollectionRepresentationResolve
205205
*/
206206
boolean useNationalizedCharacterData();
207207

208-
/**
209-
* Do we attempt to infer missing {@link jakarta.persistence.MapsId}
210-
* annotations when they are not explicitly specified?
211-
*/
212-
boolean isMapsIdInferenceEnabled();
213-
214208
/**
215209
* Should we <em>disable</em> constraint creation when
216210
* {@link jakarta.persistence.ConstraintMode#PROVIDER_DEFAULT}?

hibernate-core/src/test/java/org/hibernate/orm/test/annotations/derivedidentities/e1/b/specjmapid/CustomerInventory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import jakarta.persistence.IdClass;
1818
import jakarta.persistence.JoinColumn;
1919
import jakarta.persistence.ManyToOne;
20+
import jakarta.persistence.MapsId;
2021
import jakarta.persistence.NamedQueries;
2122
import jakarta.persistence.NamedQuery;
2223
import jakarta.persistence.Table;
@@ -49,6 +50,7 @@ public class CustomerInventory implements Serializable, Comparator<CustomerInven
4950

5051
@ManyToOne(cascade = CascadeType.MERGE)
5152
@JoinColumn(name = "CI_CUSTOMERID", nullable = false)
53+
@MapsId("custId")
5254
private Customer customer;
5355

5456
@ManyToOne(cascade = CascadeType.MERGE)

0 commit comments

Comments
 (0)