Как правильно отобразить тип полигона с помощью postgis и hibernate-spatial?

Предположим, у меня есть следующая таблица

CREATE TABLE foo (
  id BIGSERIAL PRIMARY KEY, 
  polygon GEOMETRY(POLYGON)
);

и класс сущности

@Table
@Entity
public class Foo {

   @Id
   @GeneratedValue(strategy = IDENTITY)
   private Long id;

   private Polygon polygon;

}

Мне удалось сохранить объект Foo, однако я не могу выбрать его из базы данных. Я получаю это исключение:

java.lang.NumberFormatException: For input string: "PO"

Затем я добавил следующую аннотацию поверх поля многоугольника:

@Type(type = "org.hibernate.spatial.JTSGeometryType")

но он выдает другое исключение, говорящее, что этот тип не может быть создан:

org.hibernate.MappingException: Could not instantiate Type: org.hibernate.spatial.JTSGeometryType

Обратите внимание, что я использую версию 5.1.0.Final для гибернации и гибернации-пространства.

Спасибо


person Bravo    schedule 03.06.2016    source источник


Ответы (3)


Кажется, hibernate-spartial 5.x знает, как обрабатывать геометрические типы JTS изначально, поэтому аннотации типов не требуются. Вот моя рабочая конфигурация.

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-spatial</artifactId>
  <version>5.2.3.Final</version>
</dependency>

MySQL-таблица...

CREATE TABLE `stuff` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `coordinates` point NOT NULL,
  PRIMARY KEY (`id`),
  SPATIAL KEY `coordinates` (`coordinates`)
)

Сущность JPA...

import com.vividsolutions.jts.geom.Point;
...

@Basic(optional = false)
@NotNull
@Column(nullable = false, columnDefinition = "point")
private Point coordinates;

Спящий диалект...

<property name="hibernate.dialect" value="org.hibernate.spatial.dialect.mysql.MySQLSpatialDialect"/>

Это все, но обратите внимание, что мое приложение работает в WildFly 10, который предоставляет дополнительные зависимости времени выполнения, такие как драйвер MySQL.

person Sayo Oladeji    schedule 21.10.2016

Вы также должны попробовать указать имя столбца

@Entity<br/>
@Table(name = "table_name")<br/>
public class Foo {<br/>

@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;

@Type(type = "org.hibernate.spatial.GeometryType")
@Column(name = "the_geom", nullable = true,columnDefinition="Geometry")
 private Geometry geom;

@Type(type = "org.hibernate.spatial.GeometryType",columnDefinition="Geometry")
private Polygon polygon;
}

вы также должны знать, что, начиная с Hibernate Spatial 4.0-M1, для Hibernate указывается только тип Geometry, и, следовательно, аннотация @Column должна устанавливать columnDefinition="Geometry", а не Point или что-то еще. Это может быть исправлено в будущем.

С этой антологией модификаций я наконец-то могу записать точку в базу данных! Правильная спецификация свойства:

 @Column(columnDefinition="Geometry")
 @Type(type = "org.hibernate.spatial.GeometryType")
 private Point centerPoint;

Также проверьте диалект в hibernate.cfg.xml.

Добавьте следующую строку в hibernate.cfg.xml

<property name="dialect">org.hibernate.spatial.dialect.postgis.PostgisDialect</property>
person prem30488    schedule 03.06.2016
comment
Спасибо @Parth, но в hibernate-spatial 5.x нет класса org.hibernate.spatial.GeometryType - person Bravo; 03.06.2016
comment
Вы добавили правильный диалект в файл persistence.xml. <property name="hibernate.dialect" value="org.hibernatespatial.postgis.PostgisDialect"/> - person prem30488; 04.06.2016
comment
Это может быть type="org.hibernatespatial.GeometryUserType" также в нем. - person prem30488; 04.06.2016

Я перешел на версию hibernate-spatial 4.3. Пожалуйста, смотрите мою конфигурацию ниже.

Столбец сущности:

@Column(columnDefinition = "Geometry")
@Type(type = "org.hibernate.spatial.GeometryType")
private Polygon polygon;

Класс Polygon можно найти в пакете com.vividsolutions.jts.geom.

Зависимости:

<dependencies>
     <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-spatial</artifactId>
        <version>4.3</version>
    </dependency>
    <dependency>
        <groupId>org.postgis</groupId>
        <artifactId>postgis-jdbc</artifactId>
        <version>1.3.3</version>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.4.1208.jre7</version>
    </dependency>
</dependencies>

Репозитории:

<repositories>
    <repository>
        <id>OSGEO GeoTools repo</id>
        <url>http://download.osgeo.org/webdav/geotools</url>
    </repository>
    <repository>
        <id>Hibernate Spatial repo</id>
        <url>http://www.hibernatespatial.org/repository</url>
    </repository>
</repositories>

Спящий диалект:

org.hibernate.spatial.dialect.postgis.PostgisDialect
person Bravo    schedule 20.10.2016
comment
Интересно, я обнаружил, что hibernate-spartial 5.x на самом деле умеет обрабатывать типы JTS изначально, поэтому аннотации типов не требуются. Я тоже опубликую свое решение. - person Sayo Oladeji; 21.10.2016
comment
Я действительно не хотел переходить на более раннюю версию, потому что сервер приложений, на котором я работаю, предоставляет hibernate 5.x, и я бы не хотел возиться с этим. - person Sayo Oladeji; 21.10.2016