Skip to content

Commit

Permalink
HHH-16664 NPE in MappingMetamodelImpl if inheritance is used in IdClass
Browse files Browse the repository at this point in the history
  • Loading branch information
dreab8 committed May 31, 2023
1 parent 0147541 commit e7fa3ce
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 11 deletions.
Expand Up @@ -298,7 +298,8 @@ static Component fillEmbeddable(
compositeUserTypeClass,
columns,
context,
inheritanceStatePerClass
inheritanceStatePerClass,
false
);
}

Expand All @@ -316,7 +317,8 @@ static Component fillEmbeddable(
Class<? extends CompositeUserType<?>> compositeUserTypeClass,
AnnotatedColumns columns,
MetadataBuildingContext context,
Map<XClass, InheritanceState> inheritanceStatePerClass) {
Map<XClass, InheritanceState> inheritanceStatePerClass,
boolean isIdClass) {
// inSecondPass can only be used to apply right away the second pass of a composite-element
// Because it's a value type, there is no bidirectional association, hence second pass
// ordering does not matter
Expand Down Expand Up @@ -358,7 +360,7 @@ static Component fillEmbeddable(

final XClass annotatedClass = inferredData.getPropertyClass();
final List<PropertyData> classElements =
collectClassElements( propertyAccessor, context, returnedClassOrElement, annotatedClass );
collectClassElements( propertyAccessor, context, returnedClassOrElement, annotatedClass, isIdClass );
final List<PropertyData> baseClassElements =
collectBaseClassElements( baseInferredData, propertyAccessor, context, annotatedClass );
if ( baseClassElements != null
Expand Down Expand Up @@ -421,15 +423,17 @@ private static List<PropertyData> collectClassElements(
AccessType propertyAccessor,
MetadataBuildingContext context,
XClass returnedClassOrElement,
XClass annotatedClass) {
XClass annotatedClass,
boolean isIdClass) {
final List<PropertyData> classElements = new ArrayList<>();
//embeddable elements can have type defs
final PropertyContainer container =
new PropertyContainer( returnedClassOrElement, annotatedClass, propertyAccessor );
addElementsOfClass( classElements, container, context);
//add elements of the embeddable's mapped superclasses
XClass superClass = annotatedClass.getSuperclass();
while ( superClass != null && superClass.isAnnotationPresent( MappedSuperclass.class ) ) {
while ( superClass != null && ( superClass.isAnnotationPresent( MappedSuperclass.class )
|| ( isIdClass && !Object.class.getName().equals( superClass.getName() ) ) ) ) {
//FIXME: proper support of type variables incl var resolved at upper levels
final PropertyContainer superContainer =
new PropertyContainer( superClass, annotatedClass, propertyAccessor );
Expand Down
Expand Up @@ -405,7 +405,8 @@ private boolean mapAsIdClass(
classWithIdClass,
compositeClass,
baseInferredData,
propertyAccessor
propertyAccessor,
true
);
setIgnoreIdAnnotations( ignoreIdAnnotations );
for ( Property property : mapper.getProperties() ) {
Expand All @@ -427,7 +428,8 @@ private Component createMapperProperty(
XClass classWithIdClass,
XClass compositeClass,
PropertyData baseInferredData,
AccessType propertyAccessor) {
AccessType propertyAccessor,
boolean isIdClass) {
final Component mapper = createMapper(
inheritanceStates,
persistentClass,
Expand All @@ -436,7 +438,8 @@ private Component createMapperProperty(
classWithIdClass,
compositeClass,
baseInferredData,
propertyAccessor
propertyAccessor,
isIdClass
);
final Property mapperProperty = new Property();
mapperProperty.setName( NavigablePath.IDENTIFIER_MAPPER_PROPERTY );
Expand All @@ -456,7 +459,8 @@ private Component createMapper(
XClass classWithIdClass,
XClass compositeClass,
PropertyData baseInferredData,
AccessType propertyAccessor) {
AccessType propertyAccessor,
boolean isIdClass) {
final Component mapper = fillEmbeddable(
propertyHolder,
new PropertyPreloadedData(
Expand All @@ -475,7 +479,8 @@ private Component createMapper(
null,
null,
context,
inheritanceStates
inheritanceStates,
isIdClass
);
persistentClass.setIdentifierMapper( mapper );

Expand Down Expand Up @@ -575,7 +580,8 @@ private void bindIdClass(
null,
null,
buildingContext,
inheritanceStates
inheritanceStates,
true
);
id.setKey( true );
if ( rootClass.getIdentifier() != null ) {
Expand Down

0 comments on commit e7fa3ce

Please sign in to comment.