2016-06-03 2 views
1

Предположим, у меня есть следующая таблицаКак правильно отобразить тип многоугольника с помощью postgis и hibernate-spaces?

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 версию для спящего режима и hibernate-пространственного.

Спасибо

ответ

0

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

@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, только указан тип геометрии в спящий режим, и, следовательно, Аннотации @Column должны установить columnDefinition="Geometry", а не точку или что-то еще. Это может быть исправлено в будущем.

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

@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> 
+1

Спасибо @Parth, но нет класса 'org.hibernate.spatial.GeometryType' в hibernate-spaces 5.x – Bravo

+0

Вы добавили правильный диалект в файл persistence.xml. '' –

+0

Это может быть 'type =" org.hibernatespatial.GeometryUserType "' также в нем. –

0

Я понижен версия hibernate-spaces 4.3. См. Мою конфигурацию ниже.

Entity колонка:

@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> 

Hibernate диалектные:

org.hibernate.spatial.dialect.postgis.PostgisDialect 
+0

Интересно, я узнал, что hibernate-spartial 5.x на самом деле знает, как обрабатывать типы JTS изначально, поэтому аннотация не требуется. Я тоже опубликую свое решение. –

+0

Я действительно не хотел понижать рейтинг, потому что сервер приложений, в котором я работаю, загружает hibernate 5.x, и я бы предпочел не заниматься этим. –

6

Кажется 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; 

Hibernate говор ...

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

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