|
36 | 36 | import org.hibernate.metamodel.RepresentationMode;
|
37 | 37 | import org.hibernate.metamodel.mapping.EntityMappingType;
|
38 | 38 | import org.hibernate.metamodel.mapping.MappingModelHelper;
|
| 39 | +import org.hibernate.metamodel.mapping.ModelPart; |
39 | 40 | import org.hibernate.metamodel.model.domain.internal.AttributeContainer;
|
40 | 41 | import org.hibernate.metamodel.model.domain.internal.DomainModelHelper;
|
41 | 42 | import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
|
@@ -206,19 +207,45 @@ private boolean isCompatible(PersistentAttribute<?, ?> attribute1, PersistentAtt
|
206 | 207 | return true;
|
207 | 208 | }
|
208 | 209 | 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 |
211 | 214 | );
|
212 |
| - final EntityMappingType entity2 = runtimeMetamodels.getEntityDescriptor( |
213 |
| - attribute2.getDeclaringType().getTypeName() |
| 215 | + final ModelPart modelPart2 = getEntityAttributeModelPart( |
| 216 | + attribute2, |
| 217 | + attribute2.getDeclaringType(), |
| 218 | + runtimeMetamodels |
214 | 219 | );
|
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 |
219 | 223 | );
|
220 | 224 | }
|
221 | 225 |
|
| 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 | + |
222 | 249 | @Override
|
223 | 250 | public PersistentAttribute<? super J, ?> findAttributeInSuperTypes(String name) {
|
224 | 251 | final PersistentAttribute<J, ?> local = findDeclaredAttribute( name );
|
|
0 commit comments