Skip to content

Commit c6ecdb7

Browse files
committed
Ensure TypeContributor registered JdbcType has precedence over fallback and preferred types
1 parent 37ec41d commit c6ecdb7

File tree

1 file changed

+25
-16
lines changed

1 file changed

+25
-16
lines changed

hibernate-core/src/main/java/org/hibernate/boot/model/process/spi/MetadataBuildingProcess.java

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,11 @@ private static void handleTypes(BootstrapContext bootstrapContext, MetadataBuild
391391
// add Dialect contributed types
392392
final Dialect dialect = options.getServiceRegistry().getService( JdbcServices.class ).getDialect();
393393
dialect.contributeTypes( typeContributions, options.getServiceRegistry() );
394+
// Capture the dialect configured JdbcTypes so that we can detect if a TypeContributor overwrote them,
395+
// which has precedence over the fallback and preferred type registrations
396+
final JdbcType dialectUuidDescriptor = jdbcTypeRegistry.findDescriptor( SqlTypes.UUID );
397+
final JdbcType dialectArrayDescriptor = jdbcTypeRegistry.findDescriptor( SqlTypes.ARRAY );
398+
final JdbcType dialectIntervalDescriptor = jdbcTypeRegistry.findDescriptor( SqlTypes.INTERVAL_SECOND );
394399

395400
// add TypeContributor contributed types.
396401
for ( TypeContributor contributor : classLoaderService.loadJavaServices( TypeContributor.class ) ) {
@@ -400,23 +405,38 @@ private static void handleTypes(BootstrapContext bootstrapContext, MetadataBuild
400405
// add fallback type descriptors
401406
final int preferredSqlTypeCodeForUuid = getPreferredSqlTypeCodeForUuid( serviceRegistry );
402407
if ( preferredSqlTypeCodeForUuid != SqlTypes.UUID ) {
403-
adaptToPreferredSqlTypeCode( jdbcTypeRegistry, SqlTypes.UUID, preferredSqlTypeCodeForUuid );
408+
adaptToPreferredSqlTypeCode(
409+
jdbcTypeRegistry,
410+
dialectUuidDescriptor,
411+
SqlTypes.UUID,
412+
preferredSqlTypeCodeForUuid
413+
);
404414
}
405415
else {
406416
addFallbackIfNecessary( jdbcTypeRegistry, SqlTypes.UUID, SqlTypes.BINARY );
407417
}
408418

409419
final int preferredSqlTypeCodeForArray = getPreferredSqlTypeCodeForArray( serviceRegistry );
410420
if ( preferredSqlTypeCodeForArray == SqlTypes.ARRAY ) {
411-
adaptToPreferredSqlTypeCode( jdbcTypeRegistry, null, SqlTypes.ARRAY, SqlTypes.VARBINARY );
421+
adaptToPreferredSqlTypeCode( jdbcTypeRegistry, dialectArrayDescriptor, SqlTypes.ARRAY, SqlTypes.VARBINARY );
412422
}
413423
else {
414-
adaptToPreferredSqlTypeCode( jdbcTypeRegistry, SqlTypes.ARRAY, preferredSqlTypeCodeForArray );
424+
adaptToPreferredSqlTypeCode(
425+
jdbcTypeRegistry,
426+
dialectArrayDescriptor,
427+
SqlTypes.ARRAY,
428+
preferredSqlTypeCodeForArray
429+
);
415430
}
416431

417432
final int preferredSqlTypeCodeForDuration = getPreferredSqlTypeCodeForDuration( serviceRegistry );
418433
if ( preferredSqlTypeCodeForDuration != SqlTypes.INTERVAL_SECOND ) {
419-
adaptToPreferredSqlTypeCode( jdbcTypeRegistry, SqlTypes.INTERVAL_SECOND, preferredSqlTypeCodeForDuration );
434+
adaptToPreferredSqlTypeCode(
435+
jdbcTypeRegistry,
436+
dialectIntervalDescriptor,
437+
SqlTypes.INTERVAL_SECOND,
438+
preferredSqlTypeCodeForDuration
439+
);
420440
}
421441
else {
422442
addFallbackIfNecessary( jdbcTypeRegistry, SqlTypes.INTERVAL_SECOND, SqlTypes.NUMERIC );
@@ -471,18 +491,6 @@ private static void handleTypes(BootstrapContext bootstrapContext, MetadataBuild
471491
}
472492
}
473493

474-
private static void adaptToPreferredSqlTypeCode(
475-
JdbcTypeRegistry jdbcTypeRegistry,
476-
int defaultSqlTypeCode,
477-
int preferredSqlTypeCode) {
478-
adaptToPreferredSqlTypeCode(
479-
jdbcTypeRegistry,
480-
jdbcTypeRegistry.findDescriptor( defaultSqlTypeCode ),
481-
defaultSqlTypeCode,
482-
preferredSqlTypeCode
483-
);
484-
}
485-
486494
private static void adaptToPreferredSqlTypeCode(
487495
JdbcTypeRegistry jdbcTypeRegistry,
488496
JdbcType dialectUuidDescriptor,
@@ -494,6 +502,7 @@ private static void adaptToPreferredSqlTypeCode(
494502
jdbcTypeRegistry.getDescriptor( preferredSqlTypeCode )
495503
);
496504
}
505+
// else warning?
497506
}
498507

499508
private static void adaptToPreferredSqlTypeCodeForInstant(

0 commit comments

Comments
 (0)