HHH-15174 Move annotation handling code to common method for element collection and basic values
This commit is contained in:
parent
5a4efc1c58
commit
776bc1d0aa
|
@ -149,22 +149,37 @@ public class TimeZoneStorageMappingTests {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Test
|
@Test
|
||||||
// @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsFormat.class)
|
public void testNormalize(SessionFactoryScope scope) {
|
||||||
// public void testNormalize(SessionFactoryScope scope) {
|
scope.inSession(
|
||||||
// scope.inSession(
|
session -> {
|
||||||
// session -> {
|
List<Tuple> resultList = session.createQuery(
|
||||||
// List<Tuple> resultList = session.createQuery(
|
"select e.offsetDateTimeNormalized, e.zonedDateTimeNormalized, e.offsetDateTimeNormalizedUtc, e.zonedDateTimeNormalizedUtc from TimeZoneStorageEntity e",
|
||||||
// "select e.offsetDateTimeNormalized, extract(offset from e.offsetDateTimeNormalized), e.zonedDateTimeNormalized, extract(offset from e.zonedDateTimeNormalized) from TimeZoneStorageEntity e",
|
Tuple.class
|
||||||
// Tuple.class
|
).getResultList();
|
||||||
// ).getResultList();
|
assertThat( resultList.get( 0 ).get( 0, OffsetDateTime.class ).toInstant(), Matchers.is( OFFSET_DATE_TIME.toInstant() ) );
|
||||||
// assertThat( resultList.get( 0 ).get( 0, OffsetDateTime.class ), Matchers.is( OFFSET_DATE_TIME ) );
|
assertThat( resultList.get( 0 ).get( 1, ZonedDateTime.class ).toInstant(), Matchers.is( ZONED_DATE_TIME.toInstant() ) );
|
||||||
// assertThat( resultList.get( 0 ).get( 1, ZoneOffset.class ), Matchers.is( OFFSET_DATE_TIME.getOffset() ) );
|
assertThat( resultList.get( 0 ).get( 2, OffsetDateTime.class ).toInstant(), Matchers.is( OFFSET_DATE_TIME.toInstant() ) );
|
||||||
// assertThat( resultList.get( 0 ).get( 2, ZonedDateTime.class ), Matchers.is( ZONED_DATE_TIME ) );
|
assertThat( resultList.get( 0 ).get( 3, ZonedDateTime.class ).toInstant(), Matchers.is( ZONED_DATE_TIME.toInstant() ) );
|
||||||
// assertThat( resultList.get( 0 ).get( 3, ZoneOffset.class ), Matchers.is( ZONED_DATE_TIME.getOffset() ) );
|
}
|
||||||
// }
|
);
|
||||||
// );
|
}
|
||||||
// }
|
|
||||||
|
@Test
|
||||||
|
@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsFormat.class)
|
||||||
|
@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsTimezoneTypes.class)
|
||||||
|
public void testNormalizeOffset(SessionFactoryScope scope) {
|
||||||
|
scope.inSession(
|
||||||
|
session -> {
|
||||||
|
List<Tuple> resultList = session.createQuery(
|
||||||
|
"select extract(offset from e.offsetDateTimeNormalizedUtc), extract(offset from e.zonedDateTimeNormalizedUtc) from TimeZoneStorageEntity e",
|
||||||
|
Tuple.class
|
||||||
|
).getResultList();
|
||||||
|
assertThat( resultList.get( 0 ).get( 0, ZoneOffset.class ), Matchers.is( ZoneOffset.systemDefault().getRules().getOffset( OFFSET_DATE_TIME.toInstant() ) ) );
|
||||||
|
assertThat( resultList.get( 0 ).get( 1, ZoneOffset.class ), Matchers.is( ZoneOffset.UTC ) );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@Entity(name = "TimeZoneStorageEntity")
|
@Entity(name = "TimeZoneStorageEntity")
|
||||||
@Table(name = "TimeZoneStorageEntity")
|
@Table(name = "TimeZoneStorageEntity")
|
||||||
|
@ -200,6 +215,14 @@ public class TimeZoneStorageMappingTests {
|
||||||
@Column(name = "birthday_zoned_normalized")
|
@Column(name = "birthday_zoned_normalized")
|
||||||
private ZonedDateTime zonedDateTimeNormalized;
|
private ZonedDateTime zonedDateTimeNormalized;
|
||||||
|
|
||||||
|
@TimeZoneStorage(TimeZoneStorageType.NORMALIZE_UTC)
|
||||||
|
@Column(name = "birthday_offset_normalized_utc")
|
||||||
|
private OffsetDateTime offsetDateTimeNormalizedUtc;
|
||||||
|
|
||||||
|
@TimeZoneStorage(TimeZoneStorageType.NORMALIZE_UTC)
|
||||||
|
@Column(name = "birthday_zoned_normalized_utc")
|
||||||
|
private ZonedDateTime zonedDateTimeNormalizedUtc;
|
||||||
|
|
||||||
public TimeZoneStorageEntity() {
|
public TimeZoneStorageEntity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,6 +234,8 @@ public class TimeZoneStorageMappingTests {
|
||||||
this.zonedDateTimeAuto = zonedDateTime;
|
this.zonedDateTimeAuto = zonedDateTime;
|
||||||
this.offsetDateTimeNormalized = offsetDateTime;
|
this.offsetDateTimeNormalized = offsetDateTime;
|
||||||
this.zonedDateTimeNormalized = zonedDateTime;
|
this.zonedDateTimeNormalized = zonedDateTime;
|
||||||
|
this.offsetDateTimeNormalizedUtc = offsetDateTime;
|
||||||
|
this.zonedDateTimeNormalizedUtc = zonedDateTime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -674,24 +674,6 @@ public class BasicValueBinder implements JdbcTypeIndicators {
|
||||||
enumType = null;
|
enumType = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
final TimeZoneStorage timeZoneStorageAnn = attributeXProperty.getAnnotation( TimeZoneStorage.class );
|
|
||||||
if ( timeZoneStorageAnn != null ) {
|
|
||||||
timeZoneStorageType = timeZoneStorageAnn.value();
|
|
||||||
final TimeZoneColumn timeZoneColumnAnn = attributeXProperty.getAnnotation( TimeZoneColumn.class );
|
|
||||||
if ( timeZoneColumnAnn != null ) {
|
|
||||||
if ( timeZoneStorageType != TimeZoneStorageType.AUTO && timeZoneStorageType != TimeZoneStorageType.COLUMN ) {
|
|
||||||
throw new IllegalStateException(
|
|
||||||
"@TimeZoneColumn can not be used in conjunction with @TimeZoneStorage( " + timeZoneStorageType +
|
|
||||||
" ) with attribute " + attributeXProperty.getDeclaringClass().getName() +
|
|
||||||
'.' + attributeXProperty.getName()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
timeZoneStorageType = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
normalSupplementalDetails( attributeXProperty);
|
normalSupplementalDetails( attributeXProperty);
|
||||||
|
|
||||||
// layer in support for JPA's approach for specifying a specific Java type for the collection elements...
|
// layer in support for JPA's approach for specifying a specific Java type for the collection elements...
|
||||||
|
@ -958,6 +940,24 @@ public class BasicValueBinder implements JdbcTypeIndicators {
|
||||||
if ( temporalAnn != null ) {
|
if ( temporalAnn != null ) {
|
||||||
temporalPrecision = temporalAnn.value();
|
temporalPrecision = temporalAnn.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final TimeZoneStorage timeZoneStorageAnn = attributeXProperty.getAnnotation( TimeZoneStorage.class );
|
||||||
|
if ( timeZoneStorageAnn != null ) {
|
||||||
|
timeZoneStorageType = timeZoneStorageAnn.value();
|
||||||
|
final TimeZoneColumn timeZoneColumnAnn = attributeXProperty.getAnnotation( TimeZoneColumn.class );
|
||||||
|
if ( timeZoneColumnAnn != null ) {
|
||||||
|
if ( timeZoneStorageType != TimeZoneStorageType.AUTO && timeZoneStorageType != TimeZoneStorageType.COLUMN ) {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"@TimeZoneColumn can not be used in conjunction with @TimeZoneStorage( " + timeZoneStorageType +
|
||||||
|
" ) with attribute " + attributeXProperty.getDeclaringClass().getName() +
|
||||||
|
'.' + attributeXProperty.getName()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
timeZoneStorageType = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Class<? extends UserType<?>> normalizeUserType(Class<? extends UserType<?>> userType) {
|
private static Class<? extends UserType<?>> normalizeUserType(Class<? extends UserType<?>> userType) {
|
||||||
|
|
|
@ -11,6 +11,7 @@ import java.sql.Types;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
|
import java.time.ZoneOffset;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
@ -110,6 +111,10 @@ public class OffsetDateTimeJavaType extends AbstractTemporalJavaType<OffsetDateT
|
||||||
return (X) offsetDateTime.toZonedDateTime();
|
return (X) offsetDateTime.toZonedDateTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( Instant.class.isAssignableFrom( type ) ) {
|
||||||
|
return (X) offsetDateTime.toInstant();
|
||||||
|
}
|
||||||
|
|
||||||
if ( Calendar.class.isAssignableFrom( type ) ) {
|
if ( Calendar.class.isAssignableFrom( type ) ) {
|
||||||
return (X) GregorianCalendar.from( offsetDateTime.toZonedDateTime() );
|
return (X) GregorianCalendar.from( offsetDateTime.toZonedDateTime() );
|
||||||
}
|
}
|
||||||
|
@ -169,6 +174,11 @@ public class OffsetDateTimeJavaType extends AbstractTemporalJavaType<OffsetDateT
|
||||||
return OffsetDateTime.of( zonedDateTime.toLocalDateTime(), zonedDateTime.getOffset() );
|
return OffsetDateTime.of( zonedDateTime.toLocalDateTime(), zonedDateTime.getOffset() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (value instanceof Instant) {
|
||||||
|
Instant instant = (Instant) value;
|
||||||
|
return instant.atOffset( ZoneOffset.UTC );
|
||||||
|
}
|
||||||
|
|
||||||
if (value instanceof Timestamp) {
|
if (value instanceof Timestamp) {
|
||||||
final Timestamp ts = (Timestamp) value;
|
final Timestamp ts = (Timestamp) value;
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -11,6 +11,7 @@ import java.sql.Types;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
|
import java.time.ZoneOffset;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
@ -110,6 +111,10 @@ public class ZonedDateTimeJavaType extends AbstractTemporalJavaType<ZonedDateTim
|
||||||
return (X) OffsetDateTime.of( zonedDateTime.toLocalDateTime(), zonedDateTime.getOffset() );
|
return (X) OffsetDateTime.of( zonedDateTime.toLocalDateTime(), zonedDateTime.getOffset() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( Instant.class.isAssignableFrom( type ) ) {
|
||||||
|
return (X) zonedDateTime.toInstant();
|
||||||
|
}
|
||||||
|
|
||||||
if ( Calendar.class.isAssignableFrom( type ) ) {
|
if ( Calendar.class.isAssignableFrom( type ) ) {
|
||||||
return (X) GregorianCalendar.from( zonedDateTime );
|
return (X) GregorianCalendar.from( zonedDateTime );
|
||||||
}
|
}
|
||||||
|
@ -169,6 +174,11 @@ public class ZonedDateTimeJavaType extends AbstractTemporalJavaType<ZonedDateTim
|
||||||
return offsetDateTime.toZonedDateTime();
|
return offsetDateTime.toZonedDateTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (value instanceof Instant) {
|
||||||
|
Instant instant = (Instant) value;
|
||||||
|
return instant.atZone( ZoneOffset.UTC );
|
||||||
|
}
|
||||||
|
|
||||||
if (value instanceof Timestamp) {
|
if (value instanceof Timestamp) {
|
||||||
final Timestamp ts = (Timestamp) value;
|
final Timestamp ts = (Timestamp) value;
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -14,6 +14,7 @@ import java.sql.Timestamp;
|
||||||
import java.sql.Types;
|
import java.sql.Types;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
|
import java.time.ZoneOffset;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
|
@ -84,7 +85,7 @@ public class InstantAsTimestampWithTimeZoneJdbcType implements JdbcType {
|
||||||
WrapperOptions wrapperOptions) throws SQLException {
|
WrapperOptions wrapperOptions) throws SQLException {
|
||||||
final OffsetDateTime dateTime = javaType.unwrap( value, OffsetDateTime.class, wrapperOptions );
|
final OffsetDateTime dateTime = javaType.unwrap( value, OffsetDateTime.class, wrapperOptions );
|
||||||
// supposed to be supported in JDBC 4.2
|
// supposed to be supported in JDBC 4.2
|
||||||
st.setObject( index, dateTime, Types.TIMESTAMP_WITH_TIMEZONE );
|
st.setObject( index, dateTime.withOffsetSameInstant( ZoneOffset.UTC ), Types.TIMESTAMP_WITH_TIMEZONE );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -96,7 +97,7 @@ public class InstantAsTimestampWithTimeZoneJdbcType implements JdbcType {
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
final OffsetDateTime dateTime = javaType.unwrap( value, OffsetDateTime.class, wrapperOptions );
|
final OffsetDateTime dateTime = javaType.unwrap( value, OffsetDateTime.class, wrapperOptions );
|
||||||
// supposed to be supported in JDBC 4.2
|
// supposed to be supported in JDBC 4.2
|
||||||
st.setObject( name, dateTime, Types.TIMESTAMP_WITH_TIMEZONE );
|
st.setObject( name, dateTime.withOffsetSameInstant( ZoneOffset.UTC ), Types.TIMESTAMP_WITH_TIMEZONE );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue