Skip to content

Commit ac1dcfd

Browse files
committed
unbreak the imm_date type and friends
though perhaps we could just remove this functionality
1 parent 3c7df01 commit ac1dcfd

File tree

3 files changed

+45
-14
lines changed

3 files changed

+45
-14
lines changed

hibernate-core/src/main/java/org/hibernate/type/BasicTypeReference.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.io.Serializable;
88

9+
import jakarta.persistence.TemporalType;
910
import org.hibernate.query.sqm.SqmBindableType;
1011
import org.hibernate.type.descriptor.converter.spi.BasicValueConverter;
1112

@@ -24,30 +25,41 @@ public final class BasicTypeReference<T> implements BindableType<T>, Serializabl
2425
private final int sqlTypeCode;
2526
private final BasicValueConverter<T, ?> converter;
2627
private final boolean forceImmutable;
28+
private final TemporalType precision;
2729

2830
public BasicTypeReference(String name, Class<? extends T> javaType, int sqlTypeCode) {
29-
this(name, javaType, sqlTypeCode, null);
31+
this( name, javaType, sqlTypeCode, null, null, false );
3032
}
3133

3234
public BasicTypeReference(
3335
String name,
3436
Class<? extends T> javaType,
3537
int sqlTypeCode,
3638
BasicValueConverter<T, ?> converter) {
37-
this( name, javaType, sqlTypeCode, converter, false );
39+
this( name, javaType, sqlTypeCode, null, converter, false );
40+
}
41+
42+
public BasicTypeReference(
43+
String name,
44+
Class<? extends T> javaType,
45+
int sqlTypeCode,
46+
TemporalType precision) {
47+
this( name, javaType, sqlTypeCode, precision, null, false );
3848
}
3949

4050
private BasicTypeReference(
4151
String name,
4252
Class<? extends T> javaType,
4353
int sqlTypeCode,
54+
TemporalType precision,
4455
BasicValueConverter<T, ?> converter,
4556
boolean forceImmutable) {
4657
this.name = name;
4758
//noinspection unchecked
4859
this.javaType = (Class<T>) javaType;
4960
this.sqlTypeCode = sqlTypeCode;
5061
this.converter = converter;
62+
this.precision = precision;
5163
this.forceImmutable = forceImmutable;
5264
}
5365

@@ -73,6 +85,10 @@ public int getSqlTypeCode() {
7385
return converter;
7486
}
7587

88+
public TemporalType getPrecision() {
89+
return precision;
90+
}
91+
7692
public boolean isForceImmutable() {
7793
return forceImmutable;
7894
}
@@ -82,6 +98,7 @@ public BasicTypeReference<T> asImmutable() {
8298
"imm_" + name,
8399
javaType,
84100
sqlTypeCode,
101+
precision,
85102
converter,
86103
true
87104
);

hibernate-core/src/main/java/org/hibernate/type/BasicTypeRegistry.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.hibernate.type.descriptor.java.BasicPluralJavaType;
2121
import org.hibernate.type.descriptor.java.ImmutableMutabilityPlan;
2222
import org.hibernate.type.descriptor.java.JavaType;
23+
import org.hibernate.type.descriptor.java.TemporalJavaType;
2324
import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry;
2425
import org.hibernate.type.descriptor.jdbc.ArrayJdbcType;
2526
import org.hibernate.type.descriptor.jdbc.DelegatingJdbcTypeIndicators;
@@ -92,7 +93,10 @@ else if ( !name.equals( typeReference.getName() ) ) {
9293
}
9394

9495
private <T> BasicType<T> createBasicType(String name, BasicTypeReference<T> typeReference) {
95-
final var javaType = getJavaTypeRegistry().resolveDescriptor( typeReference.getJavaType() );
96+
var javaType = getJavaTypeRegistry().resolveDescriptor( typeReference.getJavaType() );
97+
if ( javaType instanceof TemporalJavaType<?> temporalJavaType ) {
98+
javaType = temporalJavaType.resolveTypeForPrecision( typeReference.getPrecision(), typeConfiguration );
99+
}
96100
final var jdbcType = getJdbcTypeRegistry().getDescriptor( typeReference.getSqlTypeCode() );
97101
final var createdType = createBasicType( typeReference, javaType, jdbcType );
98102
typesByName.put( typeReference.getName(), createdType );
@@ -103,13 +107,13 @@ private <T> BasicType<T> createBasicType(String name, BasicTypeReference<T> type
103107
private static <T> BasicType<T> createBasicType(
104108
BasicTypeReference<T> typeReference, JavaType<T> javaType, JdbcType jdbcType) {
105109
final String name = typeReference.getName();
106-
if ( typeReference.getConverter() == null ) {
110+
final var converter = typeReference.getConverter();
111+
if ( converter == null ) {
107112
return typeReference.isForceImmutable()
108113
? new ImmutableNamedBasicTypeImpl<>( javaType, jdbcType, name )
109114
: new NamedBasicTypeImpl<>( javaType, jdbcType, name );
110115
}
111116
else {
112-
final var converter = typeReference.getConverter();
113117
assert javaType == converter.getDomainJavaType();
114118
return typeReference.isForceImmutable()
115119
? new CustomMutabilityConvertedBasicTypeImpl<>( name, jdbcType, converter,

hibernate-core/src/main/java/org/hibernate/type/StandardBasicTypes.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.TimeZone;
2929
import java.util.UUID;
3030

31+
import jakarta.persistence.TemporalType;
3132
import org.hibernate.type.spi.TypeConfiguration;
3233

3334
/**
@@ -492,7 +493,8 @@ private StandardBasicTypes() {
492493
public static final BasicTypeReference<Date> TIME = new BasicTypeReference<>(
493494
"time",
494495
java.util.Date.class,
495-
SqlTypes.TIME
496+
SqlTypes.TIME,
497+
TemporalType.TIME
496498
);
497499

498500
/**
@@ -502,7 +504,8 @@ private StandardBasicTypes() {
502504
public static final BasicTypeReference<Date> DATE = new BasicTypeReference<>(
503505
"date",
504506
java.util.Date.class,
505-
SqlTypes.DATE
507+
SqlTypes.DATE,
508+
TemporalType.DATE
506509
);
507510

508511
/**
@@ -512,7 +515,8 @@ private StandardBasicTypes() {
512515
public static final BasicTypeReference<Date> TIMESTAMP = new BasicTypeReference<>(
513516
"timestamp",
514517
java.util.Date.class,
515-
SqlTypes.TIMESTAMP
518+
SqlTypes.TIMESTAMP,
519+
TemporalType.TIMESTAMP
516520
);
517521

518522
/**
@@ -522,7 +526,8 @@ private StandardBasicTypes() {
522526
public static final BasicTypeReference<java.sql.Time> SQL_TIME = new BasicTypeReference<>(
523527
"sql_time",
524528
java.sql.Time.class,
525-
SqlTypes.TIME
529+
SqlTypes.TIME,
530+
TemporalType.TIME
526531
);
527532

528533
/**
@@ -532,7 +537,8 @@ private StandardBasicTypes() {
532537
public static final BasicTypeReference<java.sql.Date> SQL_DATE = new BasicTypeReference<>(
533538
"sql_date",
534539
java.sql.Date.class,
535-
SqlTypes.DATE
540+
SqlTypes.DATE,
541+
TemporalType.DATE
536542
);
537543

538544
/**
@@ -542,7 +548,8 @@ private StandardBasicTypes() {
542548
public static final BasicTypeReference<java.sql.Timestamp> SQL_TIMESTAMP = new BasicTypeReference<>(
543549
"sql_timestamp",
544550
java.sql.Timestamp.class,
545-
SqlTypes.TIMESTAMP
551+
SqlTypes.TIMESTAMP,
552+
TemporalType.TIMESTAMP
546553
);
547554

548555
/**
@@ -552,7 +559,8 @@ private StandardBasicTypes() {
552559
public static final BasicTypeReference<Calendar> CALENDAR = new BasicTypeReference<>(
553560
"calendar",
554561
Calendar.class,
555-
SqlTypes.TIMESTAMP
562+
SqlTypes.TIMESTAMP,
563+
TemporalType.TIMESTAMP
556564
);
557565

558566
/**
@@ -562,7 +570,8 @@ private StandardBasicTypes() {
562570
public static final BasicTypeReference<Calendar> CALENDAR_DATE = new BasicTypeReference<>(
563571
"calendar_date",
564572
Calendar.class,
565-
SqlTypes.DATE
573+
SqlTypes.DATE,
574+
TemporalType.DATE
566575
);
567576

568577
/**
@@ -572,7 +581,8 @@ private StandardBasicTypes() {
572581
public static final BasicTypeReference<Calendar> CALENDAR_TIME = new BasicTypeReference<>(
573582
"calendar_time",
574583
Calendar.class,
575-
SqlTypes.TIME
584+
SqlTypes.TIME,
585+
TemporalType.TIME
576586
);
577587

578588

0 commit comments

Comments
 (0)