From 9a8d4f0e5d85702c7774b33c204e556cd4633217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Tue, 12 Mar 2019 11:04:30 +0100 Subject: [PATCH] HHH-13266 Test LocalDate serialization when dates are remapped as Timestamp, in particular around 1900-01-01 --- .../hibernate/test/type/LocalDateTest.java | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/hibernate-core/src/test/java/org/hibernate/test/type/LocalDateTest.java b/hibernate-core/src/test/java/org/hibernate/test/type/LocalDateTest.java index aa2b79a466..e2176c2d8f 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/type/LocalDateTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/type/LocalDateTest.java @@ -10,6 +10,8 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Timestamp; +import java.sql.Types; import java.time.LocalDate; import java.time.ZoneId; import java.util.List; @@ -18,6 +20,8 @@ import javax.persistence.Entity; import javax.persistence.Id; +import org.hibernate.type.descriptor.sql.TimestampTypeDescriptor; + import org.hibernate.testing.TestForIssue; import org.junit.runners.Parameterized; @@ -36,6 +40,7 @@ public ParametersBuilder add(int year, int month, int day, ZoneId defaultTimeZon @Parameterized.Parameters(name = "{1}-{2}-{3} {0}") public static List data() { return new ParametersBuilder() + .alsoTestRemappingsWithH2( DateAsTimestampRemappingH2Dialect.class ) // Not affected by HHH-13266 (JDK-8061577) .add( 2017, 11, 6, ZONE_UTC_MINUS_8 ) .add( 2017, 11, 6, ZONE_PARIS ) @@ -44,7 +49,7 @@ public static List data() { .add( 1900, 1, 1, ZONE_OSLO ) .add( 1900, 1, 2, ZONE_PARIS ) .add( 1900, 1, 2, ZONE_AMSTERDAM ) - // Could have been affected by HHH-13266 (JDK-8061577), but was not + // Affected by HHH-13266 (JDK-8061577), but only when remapping dates as timestamps .add( 1892, 1, 1, ZONE_OSLO ) .add( 1900, 1, 1, ZONE_PARIS ) .add( 1900, 1, 1, ZONE_AMSTERDAM ) @@ -85,17 +90,32 @@ protected LocalDate getActualPropertyValue(EntityWithLocalDate entity) { @Override protected void setJdbcValueForNonHibernateWrite(PreparedStatement statement, int parameterIndex) throws SQLException { - statement.setDate( parameterIndex, getExpectedJdbcValueAfterHibernateWrite() ); + if ( DateAsTimestampRemappingH2Dialect.class.equals( getRemappingDialectClass() ) ) { + statement.setTimestamp( parameterIndex, new Timestamp( year - 1900, month - 1, day, 0, 0, 0, 0 ) ); + } + else { + statement.setDate( parameterIndex, new Date( year - 1900, month - 1, day ) ); + } } @Override - protected Date getExpectedJdbcValueAfterHibernateWrite() { - return new Date( year - 1900, month - 1, day ); + protected Object getExpectedJdbcValueAfterHibernateWrite() { + if ( DateAsTimestampRemappingH2Dialect.class.equals( getRemappingDialectClass() ) ) { + return new Timestamp( year - 1900, month - 1, day, 0, 0, 0, 0 ); + } + else { + return new Date( year - 1900, month - 1, day ); + } } @Override protected Object getActualJdbcValue(ResultSet resultSet, int columnIndex) throws SQLException { - return resultSet.getDate( columnIndex ); + if ( DateAsTimestampRemappingH2Dialect.class.equals( getRemappingDialectClass() ) ) { + return resultSet.getTimestamp( columnIndex ); + } + else { + return resultSet.getDate( columnIndex ); + } } @Entity(name = ENTITY_NAME) @@ -116,4 +136,10 @@ private EntityWithLocalDate(int id, LocalDate value) { this.value = value; } } + + public static class DateAsTimestampRemappingH2Dialect extends AbstractRemappingH2Dialect { + public DateAsTimestampRemappingH2Dialect() { + super( Types.DATE, TimestampTypeDescriptor.INSTANCE ); + } + } }