HHH-16479 Generic enum in @MappedSuperclass fails with java.lang.IllegalArgumentException: Named type [...] did not implement BasicType nor UserType

This commit is contained in:
Andrea Boriero 2023-04-17 12:43:30 +02:00
parent 31c5be55ed
commit 23e2b40ae8
1 changed files with 66 additions and 48 deletions

View File

@ -29,6 +29,7 @@ import org.hibernate.resource.beans.spi.ManagedBean;
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
import org.hibernate.type.BasicType;
import org.hibernate.type.CustomType;
import org.hibernate.type.JavaObjectType;
import org.hibernate.type.SerializableType;
import org.hibernate.type.Type;
import org.hibernate.type.descriptor.converter.spi.BasicValueConverter;
@ -221,6 +222,27 @@ public class TypeDefinition implements Serializable {
// Series of backward compatible special cases
if ( Serializable.class.isAssignableFrom( typeImplementorClass ) ) {
@SuppressWarnings({"rawtypes", "unchecked"})
final SerializableType legacyType = new SerializableType( typeImplementorClass );
return createBasicTypeResolution( legacyType, typeImplementorClass, indicators, typeConfiguration );
}
if ( indicators.getEnumeratedType() != null ) {
assert typeImplementorClass.isInterface();
return createBasicTypeResolution( new JavaObjectType(), typeImplementorClass, indicators, typeConfiguration );
}
throw new IllegalArgumentException(
"Named type [" + typeImplementorClass + "] did not implement BasicType nor UserType"
);
}
private static BasicValue.Resolution<Object> createBasicTypeResolution(
BasicType<?> type,
Class<?> typeImplementorClass,
JdbcTypeIndicators indicators,
TypeConfiguration typeConfiguration
) {
final JavaType<Serializable> jtd = typeConfiguration
.getJavaTypeRegistry()
.resolveDescriptor( typeImplementorClass );
@ -230,8 +252,6 @@ public class TypeDefinition implements Serializable {
typeConfiguration.getBasicTypeRegistry().resolve( jtd, jdbcType ),
jtd
);
@SuppressWarnings({"rawtypes", "unchecked"})
final SerializableType legacyType = new SerializableType( typeImplementorClass );
return new BasicValue.Resolution<>() {
@Override
@ -239,12 +259,14 @@ public class TypeDefinition implements Serializable {
return resolved;
}
@Override @SuppressWarnings({"rawtypes", "unchecked"})
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public BasicType getLegacyResolvedBasicType() {
return legacyType;
return type;
}
@Override @SuppressWarnings({"rawtypes", "unchecked"})
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public JavaType getDomainJavaType() {
return resolved.getMappedJavaType();
}
@ -264,7 +286,8 @@ public class TypeDefinition implements Serializable {
return resolved.getValueConverter();
}
@Override @SuppressWarnings({"rawtypes", "unchecked"})
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public MutabilityPlan getMutabilityPlan() {
// a TypeDefinition does not explicitly provide a MutabilityPlan (yet?)
return resolved.isMutable()
@ -274,11 +297,6 @@ public class TypeDefinition implements Serializable {
};
}
throw new IllegalArgumentException(
"Named type [" + typeImplementorClass + "] did not implement BasicType nor UserType"
);
}
private static Object instantiateType(
StandardServiceRegistry serviceRegistry,
MetadataBuildingOptions buildingOptions,