HHH-12383 - Type check existing type to avoid class cast exceptions related to type incompatible same named attributes being used in subtypes

This commit is contained in:
Christian Beikov 2018-03-13 19:47:34 +01:00 committed by Andrea Boriero
parent 7dd640a65e
commit 56d3ce4c2f
1 changed files with 19 additions and 12 deletions

View File

@ -127,6 +127,18 @@ public abstract class AbstractPropertyMapping implements PropertyMapping {
} }
} }
private void logIncompatibleRegistration(String path, Type existingType, Type type) {
if ( LOG.isTraceEnabled() ) {
LOG.tracev(
"Skipped adding same named type incompatible property to base type [{0}] for property [{1}], existing type = [{2}], incoming type = [{3}]",
getEntityName(),
path,
existingType,
type
);
}
}
/** /**
* Only kept around for compatibility reasons since this seems to be API. * Only kept around for compatibility reasons since this seems to be API.
* *
@ -176,11 +188,11 @@ public abstract class AbstractPropertyMapping implements PropertyMapping {
Type newType = null; Type newType = null;
MetadataImplementor metadata = (MetadataImplementor) factory; MetadataImplementor metadata = (MetadataImplementor) factory;
if ( type instanceof AnyType ) { if ( type instanceof AnyType && existingType instanceof AnyType ) {
// TODO: not sure how to handle any types. For now we just return and let the first type dictate what type the property has... // TODO: not sure how to handle any types. For now we just return and let the first type dictate what type the property has...
return; return;
} }
else if ( type instanceof CollectionType ) { else if ( type instanceof CollectionType && existingType instanceof CollectionType ) {
Collection thisCollection = metadata.getCollectionBinding( ( (CollectionType) existingType ).getRole() ); Collection thisCollection = metadata.getCollectionBinding( ( (CollectionType) existingType ).getRole() );
Collection otherCollection = metadata.getCollectionBinding( ( (CollectionType) type ).getRole() ); Collection otherCollection = metadata.getCollectionBinding( ( (CollectionType) type ).getRole() );
@ -195,17 +207,9 @@ public abstract class AbstractPropertyMapping implements PropertyMapping {
// When we discover incompatible types, we use "null" as property type to signal that the property is not resolvable on the parent type // When we discover incompatible types, we use "null" as property type to signal that the property is not resolvable on the parent type
newType = null; newType = null;
if ( LOG.isTraceEnabled() ) { logIncompatibleRegistration(path, existingType, type);
LOG.tracev(
"Skipped adding same named type incompatible property to base type [{0}] for property [{1}], existing type = [{2}], incoming type = [{3}]",
getEntityName(),
path,
existingType,
type
);
}
} }
else if ( type instanceof EntityType ) { else if ( type instanceof EntityType && existingType instanceof EntityType ) {
EntityType entityType1 = (EntityType) existingType; EntityType entityType1 = (EntityType) existingType;
EntityType entityType2 = (EntityType) type; EntityType entityType2 = (EntityType) type;
@ -220,6 +224,9 @@ public abstract class AbstractPropertyMapping implements PropertyMapping {
newType = getCommonType( metadata, entityType1, entityType2 ); newType = getCommonType( metadata, entityType1, entityType2 );
} }
else {
logIncompatibleRegistration(path, existingType, type);
}
typesByPropertyPath.put( path, newType ); typesByPropertyPath.put( path, newType );
// Set everything to empty to signal action has to be taken! // Set everything to empty to signal action has to be taken!