Приложение Spring Boot со встроенной H2GIS - инициализация выдает SQL синтаксическая ошибка - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь настроить базу данных H2 в памяти с расширением H2GIS в приложении Spring Boot. Мои build.gradle и application.properties указаны ниже. Согласно документации H2GIS и многочисленным примерам, расширение должно быть инициализировано следующим образом:

CREATE ALIAS IF NOT EXISTS H2GIS_SPATIAL FOR "org.h2gis.functions.factory.H2GISFunctions.load";
CALL H2GIS_SPATIAL();

В моем случае первая команда выполняется успешно, но вторая выдает ошибку :

Syntax error in SQL statement "CREATE DOMAIN IF NOT EXISTS POINT AS GEOMETRY(1[*]) CHECK (ST_GEOMETRYTYPECODE(VALUE) = 1);"; SQL statement:
CREATE DOMAIN IF NOT EXISTS POINT AS GEOMETRY(1) CHECK (ST_GeometryTypeCode(VALUE) = 1); [42000-200] 42000/42000 (Help)

Это происходит при выполнении метода registerGeometryType класса org.h2gis.functions.factory.H2GISFunctions. По какой-то причине оператор SQL, составленный в этом методе, не может быть выполнен.

До сих пор я пытался инициализировать расширение, поместив команды SQL в src/main/resources/data.sql и запустив их вручную в h2 -приставка. Я также пытался использовать разные версии H2GIS: 1.4.0 и 1.5.0. Все попытки дают мне один и тот же эффект.

Когда я пытался запустить автономную H2GIS, как показано в Руководство по быстрому старту H2GIS , она работала нормально.

Чтобы минимизировать В рамках этой проблемы я с нуля создал минимальное приложение Spring Boot. Вот мой build.gradle:

plugins {
    id 'org.springframework.boot' version '2.2.5.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.hibernate', name: 'hibernate-spatial', version: '5.4.10.Final'
    compile group: 'org.orbisgis', name: 'h2gis', version: '1.5.0'
    runtimeOnly 'com.h2database:h2'

    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

test {
    useJUnitPlatform()
}

мой application.properties:

spring.application.name=demo-h2gis
server.port=8080

spring.datasource.url=jdbc:h2:mem:demoh2gis
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

spring.jpa.database-platform=org.hibernate.spatial.dialect.h2geodb.GeoDBDialect
spring.jpa.hibernate.ddl-auto=create-drop

spring.h2.console.enabled=true

spring.main.allow-bean-definition-overriding=true

... и само приложение:

@SpringBootApplication
@EnableAutoConfiguration
public class DemoH2gisApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoH2gisApplication.class, args);
    }
}

Что может быть проблема?

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Выпуски H2GIS могут использоваться только с некоторыми точными выпусками базы данных H2. Для H2GIS 1.5.0 необходим устаревший и неподдерживаемый H2 1.4.197, но вы используете последнюю опубликованную версию H2 1.4.200, и H2GIS 1.5.0 не совместима с ней по многим аспектам. Вам нужно указать версию 1.4.197 H2 в вашем build.gradle.

0 голосов
/ 22 апреля 2020

В дополнение к ответу Евгения , для Spring Boot 2.2.x было достаточно переопределить версию H2 в pom. xml.

<properties>
    <!-- Need to use an earlier version of H2 when using H2GIS -->
    <h2.version>1.4.197</h2.version>
</properties>

Затем была инициализирована H2GIS правильно со следующим файлом инициализации зависимости, свойства и схемы.

<dependency>
    <groupId>org.orbisgis</groupId>
    <artifactId>h2gis-functions</artifactId>
    <version>1.3.2</version>
    <scope>runtime</scope>
</dependency>

application-default.properties (или любым другим файлом свойств, который вы используете):

# Initialise H2 with H2GIS for spatial support – see schema-h2.sql also
spring.datasource.platform=h2
spring.jpa.properties.hibernate.dialect= org.hibernate.spatial.dialect.h2geodb.GeoDBDialect

Файл ресурса schema-h2.sql

-- Needed to add H2GIS support for spatial data types
CREATE ALIAS IF NOT EXISTS H2GIS_SPATIAL FOR "org.h2gis.functions.factory.H2GISFunctions.load";
CALL H2GIS_SPATIAL();
...