From 60a3c08563aaad2e679a724dccac555eec978fa8 Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Fri, 12 Nov 2021 09:31:33 +0100 Subject: [PATCH] Downgrade H2 to 1.4.197 for testing and to allow usage of H2GIS --- .../EmbeddedIdDatabaseGeneratedValueTest.java | 29 +++++++-------- gradle/libraries.gradle | 2 +- .../java/org/hibernate/dialect/H2Dialect.java | 37 ++++++++++++------- .../dialect/sequence/H2SequenceSupport.java | 12 +++--- .../descriptor/java/spi/JavaTypeRegistry.java | 4 ++ .../SchemaDropToOutputScriptTest.java | 32 ++++++++++++---- 6 files changed, 73 insertions(+), 43 deletions(-) diff --git a/documentation/src/test/java/org/hibernate/userguide/mapping/identifier/composite/EmbeddedIdDatabaseGeneratedValueTest.java b/documentation/src/test/java/org/hibernate/userguide/mapping/identifier/composite/EmbeddedIdDatabaseGeneratedValueTest.java index 4223b0d961d0..ce7f9ed6ce43 100644 --- a/documentation/src/test/java/org/hibernate/userguide/mapping/identifier/composite/EmbeddedIdDatabaseGeneratedValueTest.java +++ b/documentation/src/test/java/org/hibernate/userguide/mapping/identifier/composite/EmbeddedIdDatabaseGeneratedValueTest.java @@ -10,31 +10,30 @@ import java.time.OffsetDateTime; import org.hibernate.dialect.H2Dialect; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.hibernate.testing.RequiresDialect; import org.hibernate.testing.TestForIssue; -import org.junit.Test; +import org.hibernate.testing.orm.junit.DomainModel; +import org.hibernate.testing.orm.junit.RequiresDialect; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; + +import org.junit.jupiter.api.Test; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; import static org.junit.Assert.assertEquals; /** * @author Vlad Mihalcea */ -@RequiresDialect(H2Dialect.class) -public class EmbeddedIdDatabaseGeneratedValueTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { Event.class }; - } +// On H2 1.4.199+ CURRENT_TIMESTAMP returns a timestamp with timezone +@RequiresDialect(value = H2Dialect.class, version = 104199) +@DomainModel(annotatedClasses = Event.class) +@SessionFactory +public class EmbeddedIdDatabaseGeneratedValueTest { @Test @TestForIssue(jiraKey = "HHH-13096") - public void test() { - final EventId eventId = doInJPA( this::entityManagerFactory, entityManager -> { - // On H2 1.4.199+ CURRENT_TIMESTAMP returns a timestamp with timezone + public void test(SessionFactoryScope scope) { + final EventId eventId = scope.fromTransaction( entityManager -> { //tag::identifiers-composite-generated-database-example[] OffsetDateTime currentTimestamp = (OffsetDateTime) entityManager .createNativeQuery( @@ -55,7 +54,7 @@ public void test() { return event.getId(); } ); - doInJPA( this::entityManagerFactory, entityManager -> { + scope.fromSession( entityManager -> { Event event = entityManager.find( Event.class, eventId ); diff --git a/gradle/libraries.gradle b/gradle/libraries.gradle index 8fc51edf9656..ab46c1c45a0e 100644 --- a/gradle/libraries.gradle +++ b/gradle/libraries.gradle @@ -13,7 +13,7 @@ ext { junitVintageVersion = '5.7.1' junit5Version = '5.7.1' - h2Version = '1.4.200' + h2Version = '1.4.197' bytemanVersion = '4.0.16' //Compatible with JDK16 jnpVersion = '5.0.6.CR1' diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java index 61ad953648c5..c406a36aa59a 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java @@ -126,28 +126,30 @@ public H2Dialect(int version) { // http://code.google.com/p/h2database/issues/detail?id=235 getDefaultProperties().setProperty( AvailableSettings.NON_CONTEXTUAL_LOB_CREATION, "true" ); + registerColumnType( SqlTypes.ARRAY, "array" ); if ( version >= 104032 ) { this.sequenceInformationExtractor = version >= 104201 ? SequenceInformationExtractorLegacyImpl.INSTANCE : SequenceInformationExtractorH2DatabaseImpl.INSTANCE; this.querySequenceString = "select * from INFORMATION_SCHEMA.SEQUENCES"; registerColumnType( Types.DECIMAL, "numeric($p,$s)" ); + if ( version >= 104197 ) { + registerColumnType( SqlTypes.UUID, "uuid" ); + registerColumnType( SqlTypes.GEOMETRY, "geometry" ); + if ( version >= 104198 ) { + registerColumnType( SqlTypes.INTERVAL_SECOND, "interval second($p,$s)" ); + } + } } else { this.sequenceInformationExtractor = SequenceInformationExtractorNoOpImpl.INSTANCE; this.querySequenceString = null; + if ( version < 200 ) { + // prior to version 2.0, H2 reported NUMERIC columns as DECIMAL, + // which caused problems for schema update tool + registerColumnType( Types.NUMERIC, "decimal($p,$s)" ); + } } - - if ( version < 200 ) { - // prior to version 2.0, H2 reported NUMERIC columns as DECIMAL, - // which caused problems for schema update tool - registerColumnType( Types.NUMERIC, "decimal($p,$s)" ); - } - - registerColumnType( SqlTypes.UUID, "uuid" ); - registerColumnType( SqlTypes.INTERVAL_SECOND, "interval second($p,$s)" ); - registerColumnType( SqlTypes.GEOMETRY, "geometry" ); - registerColumnType( SqlTypes.ARRAY, "array" ); } @Override @@ -156,8 +158,13 @@ public void contributeTypes(TypeContributions typeContributions, ServiceRegistry final JdbcTypeRegistry jdbcTypeRegistry = typeContributions.getTypeConfiguration() .getJdbcTypeDescriptorRegistry(); - jdbcTypeRegistry.addDescriptorIfAbsent( UUIDJdbcType.INSTANCE ); - jdbcTypeRegistry.addDescriptorIfAbsent( DurationIntervalSecondJdbcType.INSTANCE ); + + if ( version >= 104197 ) { + jdbcTypeRegistry.addDescriptorIfAbsent( UUIDJdbcType.INSTANCE ); + if ( version >= 104198 ) { + jdbcTypeRegistry.addDescriptorIfAbsent( DurationIntervalSecondJdbcType.INSTANCE ); + } + } } private static int parseBuildId(DialectResolutionInfo info) { @@ -205,7 +212,9 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) { CommonFunctionFactory.dayOfWeekMonthYear( queryEngine ); CommonFunctionFactory.weekQuarter( queryEngine ); CommonFunctionFactory.daynameMonthname( queryEngine ); - CommonFunctionFactory.localtimeLocaltimestamp( queryEngine ); + if ( useLocalTime ) { + CommonFunctionFactory.localtimeLocaltimestamp( queryEngine ); + } CommonFunctionFactory.bitLength( queryEngine ); CommonFunctionFactory.octetLength( queryEngine ); CommonFunctionFactory.ascii( queryEngine ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/sequence/H2SequenceSupport.java b/hibernate-core/src/main/java/org/hibernate/dialect/sequence/H2SequenceSupport.java index 410c97f1f699..3e4768555f0b 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/sequence/H2SequenceSupport.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/sequence/H2SequenceSupport.java @@ -6,12 +6,14 @@ */ package org.hibernate.dialect.sequence; +import org.hibernate.MappingException; + /** * Sequence support for {@link org.hibernate.dialect.H2Dialect}. * * @author Gavin King */ -public final class H2SequenceSupport extends ANSISequenceSupport { +public final class H2SequenceSupport implements SequenceSupport { public static final SequenceSupport INSTANCE = new H2SequenceSupport(); @@ -21,12 +23,12 @@ public String getDropSequenceString(String sequenceName) { } @Override - public String getSequenceNextValString(String sequenceName) { - return "call " + getSelectSequenceNextValString( sequenceName ); + public String getSelectSequenceNextValString(String sequenceName) { + return sequenceName + ".nextval"; } @Override - public String getSequencePreviousValString(String sequenceName) { - return "call " + getSelectSequencePreviousValString( sequenceName ); + public String getSelectSequencePreviousValString(String sequenceName) throws MappingException { + return sequenceName + ".currval"; } } diff --git a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/spi/JavaTypeRegistry.java b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/spi/JavaTypeRegistry.java index 335ebbba2cac..a3172330ea97 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/spi/JavaTypeRegistry.java +++ b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/spi/JavaTypeRegistry.java @@ -112,6 +112,10 @@ public void addDescriptor(JavaType descriptor) { performInjections( descriptor ); } + public JavaType findDescriptor(Type javaType) { + return (JavaType) descriptorsByType.get( javaType ); + } + public JavaType resolveDescriptor(Type javaType, Supplier> creator) { final JavaType cached = descriptorsByType.get( javaType ); if ( cached != null ) { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/SchemaDropToOutputScriptTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/SchemaDropToOutputScriptTest.java index 319f96a8191a..5783b73f96cd 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/SchemaDropToOutputScriptTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/SchemaDropToOutputScriptTest.java @@ -47,8 +47,6 @@ public class SchemaDropToOutputScriptTest { private File output; private ServiceRegistry serviceRegistry; private MetadataImplementor metadata; - private final String dropMyEntityTable = "drop table if exists MyEntity"; - private final String dropMySecondEntityTable = "drop table if exists MySecondEntity"; @BeforeEach @@ -113,8 +111,8 @@ public void testAppendModeFalse() throws Exception { ); List commands = Files.readAllLines( output.toPath() ); assertThat( commands.size(), is( 2 ) ); - assertThat( commands.get( 0 ), containsString( dropMyEntityTable ) ); - assertThat( commands.get( 1 ), containsString( dropMySecondEntityTable ) ); + assertThat( commands.get( 0 ), containsString( getDropMyEntityTable() ) ); + assertThat( commands.get( 1 ), containsString( getDropMySecondEntityTable() ) ); } @Test @@ -131,8 +129,8 @@ public void testAppendModeTrue() throws Exception { ); List commands = Files.readAllLines( output.toPath() ); assertThat( commands.size(), is( 11 ) ); - assertThat( commands.get( 9 ), containsString( dropMyEntityTable ) ); - assertThat( commands.get( 10 ), containsString( dropMySecondEntityTable ) ); + assertThat( commands.get( 9 ), containsString( getDropMyEntityTable() ) ); + assertThat( commands.get( 10 ), containsString( getDropMySecondEntityTable() ) ); } @Test @@ -149,8 +147,26 @@ public void testDefaultAppendMode() throws Exception { ); List commands = Files.readAllLines( output.toPath() ); assertThat( commands.size(), is( 11 ) ); - assertThat( commands.get( 9 ), containsString( dropMyEntityTable ) ); - assertThat( commands.get( 10 ), containsString( dropMySecondEntityTable ) ); + assertThat( commands.get( 9 ), containsString( getDropMyEntityTable() ) ); + assertThat( commands.get( 10 ), containsString( getDropMySecondEntityTable() ) ); + } + + public String getDropMyEntityTable() { + if ( metadata.getDatabase().getDialect().supportsIfExistsBeforeTableName() ) { + return "drop table if exists MyEntity"; + } + else { + return "drop table MyEntity if exists"; + } + } + + public String getDropMySecondEntityTable() { + if ( metadata.getDatabase().getDialect().supportsIfExistsBeforeTableName() ) { + return "drop table if exists MySecondEntity"; + } + else { + return "drop table MySecondEntity if exists"; + } } @Entity(name = "MyEntity")