Skip to content

Commit 0228dea

Browse files
committed
fix the lack of type safety of getJdbcRecommendedJavaTypeMapping()
this depended on the use of uncheckable casts to generic types enabled much less use of JavaTypeRegistry.getDescriptor()
1 parent d9be649 commit 0228dea

File tree

51 files changed

+220
-225
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+220
-225
lines changed

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ else if ( reflectedJtd instanceof SerializableJavaType
194194
else {
195195
if ( explicitJdbcType != null ) {
196196
// we have an explicit STD, but no JTD - infer JTD
197-
// NOTE : yes it's an odd case, but easy to implement here, so...
197+
// NOTE: yes it's an odd case, but easy to implement here, so...
198198
Integer length = null;
199199
Integer scale = null;
200200
if ( selectable instanceof Column column ) {
@@ -212,8 +212,10 @@ else if ( column.getLength() != null ) {
212212
}
213213
}
214214

215-
final JavaType<T> recommendedJtd =
216-
explicitJdbcType.getJdbcRecommendedJavaTypeMapping( length, scale, typeConfiguration );
215+
final var recommendedJavaType =
216+
explicitJdbcType.getRecommendedJavaType( length, scale, typeConfiguration );
217+
// TODO: check this type cast
218+
final var recommendedJtd = (JavaType<T>) recommendedJavaType;
217219
jdbcMapping = resolveSqlTypeIndicators(
218220
stdIndicators,
219221
basicTypeRegistry.resolve( recommendedJtd, explicitJdbcType ),

hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/DynamicModelHelper.java

Lines changed: 68 additions & 73 deletions
Large diffs are not rendered by default.

hibernate-core/src/main/java/org/hibernate/dialect/type/AbstractPostgreSQLStructJdbcType.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,17 +125,13 @@ public EmbeddableMappingType getEmbeddableMappingType() {
125125
}
126126

127127
@Override
128-
public <T> JavaType<T> getJdbcRecommendedJavaTypeMapping(
128+
public JavaType<?> getRecommendedJavaType(
129129
Integer precision,
130130
Integer scale,
131131
TypeConfiguration typeConfiguration) {
132-
if ( embeddableMappingType == null ) {
133-
return typeConfiguration.getJavaTypeRegistry().getDescriptor( Object[].class );
134-
}
135-
else {
136-
//noinspection unchecked
137-
return (JavaType<T>) embeddableMappingType.getMappedJavaType();
138-
}
132+
return embeddableMappingType == null
133+
? typeConfiguration.getJavaTypeRegistry().resolveDescriptor( Object[].class )
134+
: embeddableMappingType.getMappedJavaType();
139135
}
140136

141137
@Override

hibernate-core/src/main/java/org/hibernate/dialect/type/DB2StructJdbcType.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,17 +93,13 @@ public String getStructTypeName() {
9393
}
9494

9595
@Override
96-
public <T> JavaType<T> getJdbcRecommendedJavaTypeMapping(
96+
public JavaType<?> getRecommendedJavaType(
9797
Integer precision,
9898
Integer scale,
9999
TypeConfiguration typeConfiguration) {
100-
if ( embeddableMappingType == null ) {
101-
return typeConfiguration.getJavaTypeRegistry().getDescriptor( Object[].class );
102-
}
103-
else {
104-
//noinspection unchecked
105-
return (JavaType<T>) embeddableMappingType.getMappedJavaType();
106-
}
100+
return embeddableMappingType == null
101+
? typeConfiguration.getJavaTypeRegistry().resolveDescriptor( Object[].class )
102+
: embeddableMappingType.getMappedJavaType();
107103
}
108104

109105
@Override

hibernate-core/src/main/java/org/hibernate/dialect/type/OracleArrayJdbcTypeConstructor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public JdbcType resolveType(
5454
precision = columnTypeInformation.getColumnSize();
5555
scale = columnTypeInformation.getDecimalDigits();
5656
}
57-
typeName = OracleArrayJdbcType.getTypeName( elementType.getJdbcRecommendedJavaTypeMapping(
57+
typeName = OracleArrayJdbcType.getTypeName( elementType.getRecommendedJavaType(
5858
precision,
5959
scale,
6060
typeConfiguration

hibernate-core/src/main/java/org/hibernate/dialect/type/OracleNestedTableJdbcTypeConstructor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public JdbcType resolveType(
4848
precision = columnTypeInformation.getColumnSize();
4949
scale = columnTypeInformation.getDecimalDigits();
5050
}
51-
typeName = OracleArrayJdbcType.getTypeName( elementType.getJdbcRecommendedJavaTypeMapping(
51+
typeName = OracleArrayJdbcType.getTypeName( elementType.getRecommendedJavaType(
5252
precision,
5353
scale,
5454
typeConfiguration

hibernate-core/src/main/java/org/hibernate/mapping/BasicValue.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -612,14 +612,14 @@ public Boolean convertToEntityAttribute(Boolean relationalValue) {
612612
}
613613
}
614614

615-
private <T> Resolution<?> resolution(BasicJavaType explicitJavaType, JavaType<T> javaType) {
616-
final JavaType<T> basicJavaType;
615+
private Resolution<?> resolution(BasicJavaType explicitJavaType, JavaType<?> javaType) {
616+
final JavaType<?> basicJavaType;
617617
final JdbcType jdbcType;
618618
if ( explicitJdbcTypeAccess != null ) {
619619
final var typeConfiguration = getTypeConfiguration();
620620
jdbcType = explicitJdbcTypeAccess.apply( typeConfiguration );
621621
basicJavaType = javaType == null && jdbcType != null
622-
? jdbcType.getJdbcRecommendedJavaTypeMapping( null, null, typeConfiguration )
622+
? jdbcType.getRecommendedJavaType( null, null, typeConfiguration )
623623
: javaType;
624624
}
625625
else {
@@ -630,7 +630,7 @@ private <T> Resolution<?> resolution(BasicJavaType explicitJavaType, JavaType<T>
630630
throw new MappingException( "Unable to determine JavaType to use : " + this );
631631
}
632632

633-
if ( basicJavaType instanceof BasicJavaType<T> castType
633+
if ( basicJavaType instanceof BasicJavaType<?> castType
634634
&& ( !basicJavaType.getJavaTypeClass().isEnum() || enumerationStyle == null ) ) {
635635
final var context = getBuildingContext();
636636
final var autoAppliedTypeDef = context.getTypeDefinitionRegistry().resolveAutoApplied( castType );

hibernate-core/src/main/java/org/hibernate/procedure/internal/FunctionReturnImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ private OutputableType<T> getOrmType(SharedSessionContractImplementor persistenc
6767
final var typeConfiguration = persistenceContext.getFactory().getTypeConfiguration();
6868
final var javaType =
6969
typeConfiguration.getJdbcTypeRegistry().getDescriptor( getJdbcTypeCode() )
70-
.getJdbcRecommendedJavaTypeMapping( null, null, typeConfiguration );
70+
.getRecommendedJavaType( null, null, typeConfiguration );
7171
final var basicType =
7272
typeConfiguration.standardBasicTypeForJavaType( javaType.getJavaTypeClass() );
7373
//noinspection unchecked

hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/AbstractResultSetAccess.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,12 @@ public <J> BasicType<J> resolveType(int position, JavaType<J> explicitJavaType,
123123
? resolvedJdbcType
124124
: jdbcType( explicitJavaType, resolvedJdbcType, length, precision, scale, typeConfiguration );
125125
// If there is an explicit JavaType, then prefer its recommended JDBC type
126-
final JavaType<J> javaType =
126+
final var javaType =
127127
explicitJavaType == null
128-
? jdbcType.getJdbcRecommendedJavaTypeMapping( length, scale, typeConfiguration )
128+
? jdbcType.getRecommendedJavaType( length, scale, typeConfiguration )
129129
: explicitJavaType;
130-
return typeConfiguration.getBasicTypeRegistry().resolve( javaType, jdbcType );
130+
return typeConfiguration.getBasicTypeRegistry()
131+
.resolve( (JavaType<J>) javaType, jdbcType );
131132
}
132133
catch (SQLException e) {
133134
throw getSqlExceptionHelper()

hibernate-core/src/main/java/org/hibernate/sql/results/spi/ListResultsConsumer.java

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.util.Locale;
1111

1212
import org.hibernate.HibernateException;
13-
import org.hibernate.engine.spi.PersistenceContext;
1413
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1514
import org.hibernate.query.ResultListTransformer;
1615
import org.hibernate.sql.exec.spi.ExecutionContext;
@@ -20,7 +19,6 @@
2019
import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingState;
2120
import org.hibernate.type.descriptor.java.JavaType;
2221
import org.hibernate.type.descriptor.java.spi.EntityJavaType;
23-
import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry;
2422
import org.hibernate.type.spi.TypeConfiguration;
2523

2624
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -150,19 +148,19 @@ public List<R> consume(
150148
rowReader.startLoading( rowProcessingState );
151149

152150
RuntimeException ex = null;
153-
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
151+
final var persistenceContext = session.getPersistenceContextInternal();
154152
persistenceContext.beforeLoad();
155153
persistenceContext.getLoadContexts().register( jdbcValuesSourceProcessingState );
156154
try {
157-
final JavaType<R> domainResultJavaType = resolveDomainResultJavaType(
155+
final var domainResultJavaType = resolveDomainResultJavaType(
158156
rowReader.getDomainResultResultJavaType(),
159157
rowReader.getResultJavaTypes(),
160158
session.getTypeConfiguration()
161159
);
162160

163161
final boolean isEntityResultType = domainResultJavaType instanceof EntityJavaType;
164162
final int initialCollectionSize = Math.min( jdbcValues.getResultCountEstimate(), INITIAL_COLLECTION_SIZE_LIMIT );
165-
final Results<R> results = createResults( isEntityResultType, domainResultJavaType, initialCollectionSize );
163+
final var results = createResults( isEntityResultType, domainResultJavaType, initialCollectionSize );
166164
final int readRows = readRows( rowProcessingState, rowReader, isEntityResultType, results );
167165
rowReader.finishUp( rowProcessingState );
168166
jdbcValuesSourceProcessingState.finishUp( readRows > 1 );
@@ -283,36 +281,32 @@ private static <R> int readUnique(
283281
return readRows;
284282
}
285283

284+
@SuppressWarnings("unchecked") //TODO: fix the unchecked casts
286285
private JavaType<R> resolveDomainResultJavaType(
287286
Class<R> domainResultResultJavaType,
288287
List<@Nullable JavaType<?>> resultJavaTypes,
289288
TypeConfiguration typeConfiguration) {
290-
final JavaTypeRegistry javaTypeRegistry = typeConfiguration.getJavaTypeRegistry();
289+
final var javaTypeRegistry = typeConfiguration.getJavaTypeRegistry();
291290

292291
if ( domainResultResultJavaType != null ) {
293292
final var resultJavaType = javaTypeRegistry.resolveDescriptor( domainResultResultJavaType );
294293
// Could be that the user requested a more general type than the actual type,
295294
// so resolve the most concrete type since this type is used to determine equality of objects
296295
if ( resultJavaTypes.size() == 1
297296
&& isMoreConcrete( resultJavaType, resultJavaTypes.get( 0 ) ) ) {
298-
//noinspection unchecked
299297
return (JavaType<R>) resultJavaTypes.get( 0 );
300298
}
301299
return resultJavaType;
302300
}
303301

304302
if ( resultJavaTypes.size() == 1 ) {
305303
final var firstJavaType = resultJavaTypes.get( 0 );
306-
if ( firstJavaType == null ) {
307-
return javaTypeRegistry.getDescriptor( Object.class );
308-
}
309-
else {
310-
//noinspection unchecked
311-
return (JavaType<R>) firstJavaType;
312-
}
304+
return firstJavaType == null
305+
? (JavaType<R>) javaTypeRegistry.resolveDescriptor( Object.class )
306+
: (JavaType<R>) firstJavaType;
313307
}
314308
else {
315-
return javaTypeRegistry.getDescriptor( Object[].class );
309+
return (JavaType<R>) javaTypeRegistry.resolveDescriptor( Object[].class );
316310
}
317311
}
318312

0 commit comments

Comments
 (0)