簡體   English   中英

如何使用postgis和hibernate-spatial正確映射多邊形類型?

[英]How to correctly map a polygon type with postgis and 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"

然后,我在polygon字段頂部添加了以下注釋:

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

但它拋出另一個異常,說這種類型無法實例化:

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

請注意,我使用5.1.0.Final版本用於hibernate和hibernate-spatial。

謝謝

似乎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中運行,它提供了額外的運行時依賴性,如MySQL驅動程序。

你也應該嘗試給出列名

@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,因此@Column注釋必須設置columnDefinition="Geometry" ,而不是Point或其他任何東西。 這可能在將來修復。

通過這個修改選集,我終於可以寫一個數據庫了! 正確的屬性規范是:

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

還要在hibernate.cfg.xml中使用dialect進行檢查

將以下行添加到hibernate.cfg.xml

<property name="dialect">org.hibernate.spatial.dialect.postgis.PostgisDialect</property>

我降級到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>

Hibernate方言:

org.hibernate.spatial.dialect.postgis.PostgisDialect

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM