Skip to content

Commit 605886b

Browse files
mbelladebeikov
authored andcommitted
HHH-17491 Fix checking subtype attribute declared in MappedSuperclass
1 parent 67af47a commit 605886b

File tree

1 file changed

+35
-8
lines changed

1 file changed

+35
-8
lines changed

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/AbstractManagedType.java

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.hibernate.metamodel.RepresentationMode;
3737
import org.hibernate.metamodel.mapping.EntityMappingType;
3838
import org.hibernate.metamodel.mapping.MappingModelHelper;
39+
import org.hibernate.metamodel.mapping.ModelPart;
3940
import org.hibernate.metamodel.model.domain.internal.AttributeContainer;
4041
import org.hibernate.metamodel.model.domain.internal.DomainModelHelper;
4142
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
@@ -206,19 +207,45 @@ private boolean isCompatible(PersistentAttribute<?, ?> attribute1, PersistentAtt
206207
return true;
207208
}
208209
final MappingMetamodel runtimeMetamodels = jpaMetamodel().getMappingMetamodel();
209-
final EntityMappingType entity1 = runtimeMetamodels.getEntityDescriptor(
210-
attribute1.getDeclaringType().getTypeName()
210+
final ModelPart modelPart1 = getEntityAttributeModelPart(
211+
attribute1,
212+
attribute1.getDeclaringType(),
213+
runtimeMetamodels
211214
);
212-
final EntityMappingType entity2 = runtimeMetamodels.getEntityDescriptor(
213-
attribute2.getDeclaringType().getTypeName()
215+
final ModelPart modelPart2 = getEntityAttributeModelPart(
216+
attribute2,
217+
attribute2.getDeclaringType(),
218+
runtimeMetamodels
214219
);
215-
216-
return entity1 != null && entity2 != null && MappingModelHelper.isCompatibleModelPart(
217-
entity1.findSubPart( attribute1.getName() ),
218-
entity2.findSubPart( attribute2.getName() )
220+
return modelPart1 != null && modelPart2 != null && MappingModelHelper.isCompatibleModelPart(
221+
modelPart1,
222+
modelPart2
219223
);
220224
}
221225

226+
private static ModelPart getEntityAttributeModelPart(
227+
PersistentAttribute<?, ?> attribute,
228+
ManagedDomainType<?> domainType,
229+
MappingMetamodel mappingMetamodel) {
230+
if ( domainType instanceof EntityDomainType<?> ) {
231+
final EntityMappingType entity = mappingMetamodel.getEntityDescriptor( domainType.getTypeName() );
232+
return entity.findSubPart( attribute.getName() );
233+
}
234+
else {
235+
ModelPart candidate = null;
236+
for ( ManagedDomainType<?> subType : domainType.getSubTypes() ) {
237+
final ModelPart modelPart = getEntityAttributeModelPart( attribute, subType, mappingMetamodel );
238+
if ( modelPart != null ) {
239+
if ( candidate != null && !MappingModelHelper.isCompatibleModelPart( candidate, modelPart ) ) {
240+
return null;
241+
}
242+
candidate = modelPart;
243+
}
244+
}
245+
return candidate;
246+
}
247+
}
248+
222249
@Override
223250
public PersistentAttribute<? super J, ?> findAttributeInSuperTypes(String name) {
224251
final PersistentAttribute<J, ?> local = findDeclaredAttribute( name );

0 commit comments

Comments
 (0)