Skip to content

Commit 433d83b

Browse files
committed
try to improve type safety in JavaTypeRegistry and MutableMutabilityPlant
1 parent 9e40f1c commit 433d83b

File tree

20 files changed

+387
-572
lines changed

20 files changed

+387
-572
lines changed

hibernate-core/src/main/java/org/hibernate/boot/model/convert/internal/ConverterHelper.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import org.hibernate.boot.spi.ClassmateContext;
1616
import org.hibernate.boot.spi.MetadataBuildingContext;
1717
import org.hibernate.internal.util.GenericsHelper;
18-
import org.hibernate.internal.util.type.PrimitiveWrapperHelper;
1918
import org.hibernate.models.spi.MemberDetails;
2019

2120
import com.fasterxml.classmate.ResolvedType;
@@ -24,6 +23,8 @@
2423
import com.fasterxml.classmate.members.ResolvedMethod;
2524
import jakarta.persistence.AttributeConverter;
2625

26+
import static org.hibernate.internal.util.type.PrimitiveWrappers.canonicalize;
27+
2728
/**
2829
* Helpers related to handling converters
2930
*/
@@ -100,11 +101,8 @@ else if ( converterParamTypes.size() != 2 ) {
100101
* @return {@code true} if they match, otherwise {@code false}.
101102
*/
102103
public static boolean typesMatch(ResolvedType converterDefinedType, ResolvedType checkType) {
103-
Class<?> erasedCheckType = checkType.getErasedType();
104-
if ( erasedCheckType.isPrimitive() ) {
105-
erasedCheckType = PrimitiveWrapperHelper.getDescriptorByPrimitiveType( erasedCheckType ).getWrapperClass();
106-
}
107-
else if ( erasedCheckType.isArray() ) {
104+
final var erasedCheckType = canonicalize( checkType.getErasedType() );
105+
if ( erasedCheckType.isArray() ) {
108106
// converterDefinedType have type parameters if it extends super generic class
109107
// but checkType doesn't have any type parameters
110108
// comparing erased type is enough

hibernate-core/src/main/java/org/hibernate/boot/model/process/internal/VersionResolution.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,29 +28,29 @@
2828
*/
2929
public class VersionResolution<E> implements BasicValue.Resolution<E> {
3030

31-
// todo (6.0) : support explicit JTD?
32-
// todo (6.0) : support explicit STD?
33-
34-
public static <E> VersionResolution<E> from(
31+
public static VersionResolution<?> from(
3532
Function<TypeConfiguration, java.lang.reflect.Type> implicitJavaTypeAccess,
3633
TimeZoneStorageType timeZoneStorageType,
3734
MetadataBuildingContext context) {
38-
39-
// todo (6.0) : add support for Dialect-specific interpretation?
40-
4135
final var typeConfiguration = context.getBootstrapContext().getTypeConfiguration();
4236
final var implicitJavaType = implicitJavaTypeAccess.apply( typeConfiguration );
43-
final JavaType<E> registered = typeConfiguration.getJavaTypeRegistry().getDescriptor( implicitJavaType );
44-
final var basicJavaType = (BasicJavaType<E>) registered;
37+
final var registered = typeConfiguration.getJavaTypeRegistry().resolveDescriptor( implicitJavaType );
38+
return resolve( timeZoneStorageType, context, (BasicJavaType<?>) registered );
39+
}
4540

41+
private static <E> VersionResolution<E> resolve(
42+
TimeZoneStorageType timeZoneStorageType,
43+
MetadataBuildingContext context,
44+
BasicJavaType<E> basicJavaType) {
45+
final var typeConfiguration = context.getBootstrapContext().getTypeConfiguration();
4646
final var recommendedJdbcType = basicJavaType.getRecommendedJdbcType(
4747
new JdbcTypeIndicators() {
4848
@Override
4949
public TypeConfiguration getTypeConfiguration() {
5050
return typeConfiguration;
5151
}
5252

53-
@Override
53+
@Override @SuppressWarnings("deprecation")
5454
public TemporalType getTemporalPrecision() {
5555
// if it is a temporal version, it needs to be a TIMESTAMP
5656
return TemporalType.TIMESTAMP;
@@ -106,7 +106,6 @@ public Dialect getDialect() {
106106
final var basicTypeRegistry = typeConfiguration.getBasicTypeRegistry();
107107
final var basicType = basicTypeRegistry.resolve( basicJavaType, recommendedJdbcType );
108108
final var legacyType = basicTypeRegistry.getRegisteredType( basicJavaType.getJavaTypeClass() );
109-
110109
assert legacyType.getJdbcType().getDefaultSqlTypeCode() == recommendedJdbcType.getDefaultSqlTypeCode();
111110

112111
return new VersionResolution<>( basicJavaType, recommendedJdbcType, basicType, legacyType );

hibernate-core/src/main/java/org/hibernate/dialect/function/array/DdlTypeHelper.java

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,28 @@
77
import java.lang.reflect.Type;
88
import java.util.List;
99

10-
import org.hibernate.dialect.Dialect;
1110
import org.hibernate.engine.jdbc.Size;
12-
import org.hibernate.internal.build.AllowReflection;
1311
import org.hibernate.metamodel.mapping.JdbcMappingContainer;
1412
import org.hibernate.metamodel.mapping.SqlTypedMapping;
1513
import org.hibernate.metamodel.model.domain.DomainType;
1614
import org.hibernate.metamodel.model.domain.ReturnableType;
1715
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
1816
import org.hibernate.type.BasicType;
1917
import org.hibernate.type.descriptor.java.BasicPluralJavaType;
20-
import org.hibernate.type.descriptor.sql.DdlType;
21-
import org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry;
2218
import org.hibernate.type.internal.ParameterizedTypeImpl;
2319
import org.hibernate.type.spi.TypeConfiguration;
2420

2521
public class DdlTypeHelper {
2622
@SuppressWarnings("unchecked")
27-
@AllowReflection
23+
// @AllowReflection
2824
public static BasicType<?> resolveArrayType(DomainType<?> elementType, TypeConfiguration typeConfiguration) {
29-
@SuppressWarnings("unchecked")
3025
final var arrayJavaType =
3126
(BasicPluralJavaType<Object>)
3227
typeConfiguration.getJavaTypeRegistry()
3328
.resolveArrayDescriptor( elementType.getJavaType() );
34-
final Dialect dialect = typeConfiguration.getCurrentBaseSqlTypeIndicators().getDialect();
3529
return arrayJavaType.resolveType(
3630
typeConfiguration,
37-
dialect,
31+
typeConfiguration.getCurrentBaseSqlTypeIndicators().getDialect(),
3832
(BasicType<Object>) elementType,
3933
null,
4034
typeConfiguration.getCurrentBaseSqlTypeIndicators()
@@ -43,7 +37,6 @@ public static BasicType<?> resolveArrayType(DomainType<?> elementType, TypeConfi
4337

4438
@SuppressWarnings("unchecked")
4539
public static BasicType<?> resolveListType(DomainType<?> elementType, TypeConfiguration typeConfiguration) {
46-
@SuppressWarnings("unchecked")
4740
final BasicPluralJavaType<Object> arrayJavaType =
4841
(BasicPluralJavaType<Object>)
4942
typeConfiguration.getJavaTypeRegistry()
@@ -52,10 +45,9 @@ public static BasicType<?> resolveListType(DomainType<?> elementType, TypeConfig
5245
new ParameterizedTypeImpl( List.class, new Type[]{ elementType.getJavaType() }, null ),
5346
typeConfiguration
5447
);
55-
final Dialect dialect = typeConfiguration.getCurrentBaseSqlTypeIndicators().getDialect();
5648
return arrayJavaType.resolveType(
5749
typeConfiguration,
58-
dialect,
50+
typeConfiguration.getCurrentBaseSqlTypeIndicators().getDialect(),
5951
(BasicType<Object>) elementType,
6052
null,
6153
typeConfiguration.getCurrentBaseSqlTypeIndicators()
@@ -79,11 +71,9 @@ public static String getTypeName(JdbcMappingContainer type, Size size, TypeConfi
7971
return AbstractSqlAstTranslator.getSqlTypeName( sqlTypedMapping, typeConfiguration );
8072
}
8173
else {
82-
final BasicType<?> basicType = (BasicType<?>) type.getSingleJdbcMapping();
83-
final DdlTypeRegistry ddlTypeRegistry = typeConfiguration.getDdlTypeRegistry();
84-
final DdlType ddlType = ddlTypeRegistry.getDescriptor(
85-
basicType.getJdbcType().getDdlTypeCode()
86-
);
74+
final var basicType = (BasicType<?>) type.getSingleJdbcMapping();
75+
final var ddlTypeRegistry = typeConfiguration.getDdlTypeRegistry();
76+
final var ddlType = ddlTypeRegistry.getDescriptor( basicType.getJdbcType().getDdlTypeCode() );
8777
return ddlType.getTypeName( size, basicType, ddlTypeRegistry );
8878
}
8979
}
@@ -97,11 +87,9 @@ public static String getTypeName(ReturnableType<?> type, Size size, TypeConfigur
9787
return AbstractSqlAstTranslator.getSqlTypeName( sqlTypedMapping, typeConfiguration );
9888
}
9989
else {
100-
final BasicType<?> basicType = (BasicType<?>) ( (JdbcMappingContainer) type ).getSingleJdbcMapping();
101-
final DdlTypeRegistry ddlTypeRegistry = typeConfiguration.getDdlTypeRegistry();
102-
final DdlType ddlType = ddlTypeRegistry.getDescriptor(
103-
basicType.getJdbcType().getDdlTypeCode()
104-
);
90+
final var basicType = (BasicType<?>) ( (JdbcMappingContainer) type ).getSingleJdbcMapping();
91+
final var ddlTypeRegistry = typeConfiguration.getDdlTypeRegistry();
92+
final var ddlType = ddlTypeRegistry.getDescriptor( basicType.getJdbcType().getDdlTypeCode() );
10593
return ddlType.getTypeName( size, basicType, ddlTypeRegistry );
10694
}
10795
}
@@ -123,11 +111,9 @@ public static String getCastTypeName(JdbcMappingContainer type, Size size, TypeC
123111
return AbstractSqlAstTranslator.getCastTypeName( sqlTypedMapping, typeConfiguration );
124112
}
125113
else {
126-
final BasicType<?> basicType = (BasicType<?>) type.getSingleJdbcMapping();
127-
final DdlTypeRegistry ddlTypeRegistry = typeConfiguration.getDdlTypeRegistry();
128-
final DdlType ddlType = ddlTypeRegistry.getDescriptor(
129-
basicType.getJdbcType().getDdlTypeCode()
130-
);
114+
final var basicType = (BasicType<?>) type.getSingleJdbcMapping();
115+
final var ddlTypeRegistry = typeConfiguration.getDdlTypeRegistry();
116+
final var ddlType = ddlTypeRegistry.getDescriptor( basicType.getJdbcType().getDdlTypeCode() );
131117
return ddlType.getCastTypeName( size, basicType, ddlTypeRegistry );
132118
}
133119
}
@@ -141,11 +127,9 @@ public static String getCastTypeName(ReturnableType<?> type, Size size, TypeConf
141127
return AbstractSqlAstTranslator.getCastTypeName( sqlTypedMapping, typeConfiguration );
142128
}
143129
else {
144-
final BasicType<?> basicType = (BasicType<?>) ( (JdbcMappingContainer) type ).getSingleJdbcMapping();
145-
final DdlTypeRegistry ddlTypeRegistry = typeConfiguration.getDdlTypeRegistry();
146-
final DdlType ddlType = ddlTypeRegistry.getDescriptor(
147-
basicType.getJdbcType().getDdlTypeCode()
148-
);
130+
final var basicType = (BasicType<?>) ( (JdbcMappingContainer) type ).getSingleJdbcMapping();
131+
final var ddlTypeRegistry = typeConfiguration.getDdlTypeRegistry();
132+
final var ddlType = ddlTypeRegistry.getDescriptor( basicType.getJdbcType().getDdlTypeCode() );
149133
return ddlType.getCastTypeName( size, basicType, ddlTypeRegistry );
150134
}
151135
}

hibernate-core/src/main/java/org/hibernate/dialect/function/array/JsonArrayViaElementArgumentReturnTypeResolver.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77
import java.util.List;
88
import java.util.function.Supplier;
99

10-
import org.hibernate.internal.build.AllowReflection;
1110
import org.hibernate.metamodel.mapping.BasicValuedMapping;
12-
import org.hibernate.metamodel.mapping.MappingModelExpressible;
1311
import org.hibernate.metamodel.model.domain.DomainType;
1412
import org.hibernate.metamodel.model.domain.ReturnableType;
1513
import org.hibernate.query.sqm.produce.function.FunctionReturnTypeResolver;
@@ -20,7 +18,6 @@
2018
import org.hibernate.type.SqlTypes;
2119
import org.hibernate.type.descriptor.java.BasicPluralJavaType;
2220
import org.hibernate.type.descriptor.jdbc.DelegatingJdbcTypeIndicators;
23-
import org.hibernate.type.descriptor.jdbc.JdbcTypeIndicators;
2421
import org.hibernate.type.spi.TypeConfiguration;
2522

2623
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -44,12 +41,12 @@ public ReturnableType<?> resolveFunctionReturnType(
4441
TypeConfiguration typeConfiguration) {
4542
if ( converter != null ) {
4643
if ( converter.isInTypeInference() ) {
47-
// Don't default to a Json array when in type inference mode.
44+
// Don't default to a JSON array when in type inference mode.
4845
// Comparing e.g. `array() = (select array_agg() ...)` will trigger this resolver
4946
// while inferring the type for `array()`, which we want to avoid.
5047
return null;
5148
}
52-
final MappingModelExpressible<?> inferredType = converter.resolveFunctionImpliedReturnType();
49+
final var inferredType = converter.resolveFunctionImpliedReturnType();
5350
if ( inferredType != null ) {
5451
if ( inferredType instanceof ReturnableType<?> returnableType ) {
5552
return returnableType;
@@ -62,8 +59,8 @@ else if ( inferredType instanceof BasicValuedMapping basicValuedMapping ) {
6259
if ( impliedType != null ) {
6360
return impliedType;
6461
}
65-
for ( SqmTypedNode<?> argument : arguments ) {
66-
final DomainType<?> sqmType = argument.getExpressible().getSqmType();
62+
for ( var argument : arguments ) {
63+
final var sqmType = argument.getExpressible().getSqmType();
6764
if ( sqmType instanceof ReturnableType<?> ) {
6865
return resolveJsonArrayType( sqmType, typeConfiguration );
6966
}
@@ -78,14 +75,14 @@ public BasicValuedMapping resolveFunctionReturnType(
7875
return null;
7976
}
8077

81-
@AllowReflection
78+
// @AllowReflection
8279
public static <T> BasicType<?> resolveJsonArrayType(DomainType<T> elementType, TypeConfiguration typeConfiguration) {
8380
@SuppressWarnings("unchecked")
8481
final var arrayJavaType =
8582
(BasicPluralJavaType<T>)
8683
typeConfiguration.getJavaTypeRegistry()
8784
.resolveArrayDescriptor( elementType.getJavaType() );
88-
final JdbcTypeIndicators currentBaseSqlTypeIndicators = typeConfiguration.getCurrentBaseSqlTypeIndicators();
85+
final var currentBaseSqlTypeIndicators = typeConfiguration.getCurrentBaseSqlTypeIndicators();
8986
return arrayJavaType.resolveType(
9087
typeConfiguration,
9188
currentBaseSqlTypeIndicators.getDialect(),

0 commit comments

Comments
 (0)