Skip to content

Commit 19c8bd8

Browse files
dreab8mbellade
andcommitted
HHH-20356 HHH-19020 NPE in ClassPropertyHolder#addPropertyToMappedSuperclass method
Co-authored-by: Marco Belladelli <marcobladel@gmail.com>
1 parent e53f69d commit 19c8bd8

2 files changed

Lines changed: 25 additions & 14 deletions

File tree

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

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import static org.hibernate.boot.model.internal.BinderHelper.getRelativePath;
6969
import static org.hibernate.boot.model.internal.BinderHelper.hasToOneAnnotation;
7070
import static org.hibernate.boot.model.internal.HCANNHelper.findContainingAnnotations;
71+
import static org.hibernate.boot.model.internal.InheritanceState.getSuperclassInheritanceState;
7172
import static org.hibernate.boot.model.internal.PropertyBinder.addElementsOfClass;
7273
import static org.hibernate.boot.model.internal.PropertyBinder.processElementAnnotations;
7374
import static org.hibernate.boot.model.internal.PropertyBinder.processId;
@@ -393,6 +394,14 @@ static Component fillEmbeddable(
393394
context
394395
);
395396
}
397+
else {
398+
// We need to register ancestor @MappedSuperclass metadata even for embedded types of classes
399+
// that are not annotated as @Embeddable (i.e. that don't have an inheritance state)
400+
final var superState = getSuperclassInheritanceState( returnedClassOrElement, inheritanceStatePerClass );
401+
if ( superState != null && superState.isEmbeddableSuperclass() ) {
402+
superState.postProcess( component );
403+
}
404+
}
396405

397406
final XClass annotatedClass = inferredData.getPropertyClass();
398407
final Map<String, String> subclassToSuperclass = component.isPolymorphic() ? new HashMap<>() : null;
@@ -510,19 +519,19 @@ private static void bindDiscriminator(
510519
PropertyData propertyData,
511520
InheritanceState inheritanceState,
512521
MetadataBuildingContext context) {
513-
if ( inheritanceState == null ) {
514-
return;
515-
}
516-
final AnnotatedDiscriminatorColumn discriminatorColumn = processEmbeddableDiscriminatorProperties(
517-
componentClass,
518-
propertyData,
519-
parentHolder,
520-
holder,
521-
inheritanceState,
522-
context
523-
);
524-
if ( discriminatorColumn != null ) {
525-
bindDiscriminatorColumnToComponent( component, discriminatorColumn, holder, context );
522+
// Discriminated inheritance only applies to explicit @Embeddable types
523+
if ( !inheritanceState.isEmbeddableSuperclass()) {
524+
final AnnotatedDiscriminatorColumn discriminatorColumn = processEmbeddableDiscriminatorProperties(
525+
componentClass,
526+
propertyData,
527+
parentHolder,
528+
holder,
529+
inheritanceState,
530+
context
531+
);
532+
if ( discriminatorColumn != null ) {
533+
bindDiscriminatorColumnToComponent( component, discriminatorColumn, holder, context );
534+
}
526535
}
527536
}
528537

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,9 @@ private org.hibernate.mapping.MappedSuperclass processMappedSuperclass(Table imp
332332
superEntityState != null ?
333333
buildingContext.getMetadataCollector().getEntityBinding( superEntityState.getClazz().getName() ) :
334334
null;
335-
final int lastMappedSuperclass = classesToProcessForMappedSuperclass.size() - 1;
335+
final int lastMappedSuperclass = isEmbeddableSuperclass
336+
? classesToProcessForMappedSuperclass.size()
337+
: classesToProcessForMappedSuperclass.size() - 1;
336338
org.hibernate.mapping.MappedSuperclass mappedSuperclass = null;
337339
for ( int index = 0; index < lastMappedSuperclass; index++ ) {
338340
org.hibernate.mapping.MappedSuperclass parentSuperclass = mappedSuperclass;

0 commit comments

Comments
 (0)