Grails 3 — тип геометрии в домене

Я пытаюсь добавить точку в объект домена в Grails 3.3.8 (текущий последний выпуск). Grails 3.3.8 использует Hibernate 5.1.5, в котором есть поддержка hibernate-spatial.

В build.gradle:

compile group: 'org.hibernate', name: 'hibernate-spatial', version: '5.1.5.Final'
compile group: 'com.vividsolutions', name: 'jts', version: '1.13'

В конфигурации:

driverClassName = 'com.microsoft.sqlserver.jdbc.SQLServerDriver'
dialect = 'org.hibernate.dialect.SqlServer2008SpatialDialect'

В домене PointTest.groovy:

package com.test

import com.vividsolutions.jts.geom.Point
class PointTest {
    Point coords

    static constraints = {
    }

    static mapping = {
        coords sqlType: 'geometry(Point,4326)'
    }
}

Из того, что я могу сказать из этого сообщения о переполнении стека, приведенное выше должно работать. Но когда я запускаю проект Grails, таблица не создается. Если я удалю строку из mapping, таблица создастся, но coords будет не того типа, varbinary(255).

Java-версия: 8

Версия Grails: 3.3.8

Версия базы данных: SQL Server 2017.


person Anonymous1    schedule 04.11.2018    source источник
comment
Но когда я запускаю проект Grails, таблица не создается. - Какая таблица не создана?   -  person Jeff Scott Brown    schedule 05.11.2018
comment
Я не настроен здесь для тестирования с SQL Server прямо сейчас, и это может иметь значение, но когда я тестирую ваш код в приложении 3.3.8 с H2, я вижу, что создается следующий DDL: create table point_test (id bigint generated by default as identity, version bigint not null, coords geometry(Point,4326) not null, primary key (id)). Вы видите то же самое, если используете H2?   -  person Jeff Scott Brown    schedule 05.11.2018
comment
Этот geometry(Point,4326) не будет распознан БД.   -  person Jeff Scott Brown    schedule 05.11.2018
comment
Таблица point_test вообще не создается. Создание всей таблицы пропускается. Я попробую с H2 и вернусь к вам. Однако я хочу, чтобы столбец был настроен с SRID 4326.   -  person Anonymous1    schedule 05.11.2018
comment
В ходе двойной проверки с помощью H2 я понял, что у меня неправильный путь для диалекта Sql Server. Правильный путь: org.hibernate.spatial.dialect.sqlserver.SqlServer2008SpatialDialect. После исправления этого пути я получаю следующее: создайте таблицу point_test (идентификатор id bigint не равен нулю, версия bigint не равна нулю, координаты GEOMETRY не равны нулю, первичный ключ (id)). Я не уверен, как заставить его использовать SRID 4326, но, возможно, мне нужно сделать это для каждого объекта при инициализации.   -  person Anonymous1    schedule 05.11.2018
comment
SRID устанавливается для каждого объекта при инициализации, так что это отвечает на все мои вопросы. Спасибо за вашу помощь!   -  person Anonymous1    schedule 05.11.2018


Ответы (1)


dialect = 'org.hibernate.dialect.SqlServer2008SpatialDialect'

вместо этого должно быть

dialect = 'org.hibernate.spatial.dialect.sqlserver.SqlServer2008SpatialDialect'

SRID задается для каждого объекта и не инициализируется как часть типа столбца.

person Anonymous1    schedule 05.11.2018
comment
то же самое в Grails 4 - person Juan Salvador; 04.08.2019