首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地将多边形类型映射到postgis和hibernate-spatial?

如何正确地将多边形类型映射到postgis和hibernate-spatial?
EN

Stack Overflow用户
提问于 2016-06-03 19:16:02
回答 3查看 7.5K关注 0票数 5

假设我有下面的表

代码语言:javascript
复制
CREATE TABLE foo (
  id BIGSERIAL PRIMARY KEY, 
  polygon GEOMETRY(POLYGON)
);

和实体类

代码语言:javascript
复制
@Table
@Entity
public class Foo {

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

   private Polygon polygon;

}

我设法保存了一个Foo实体,但是我不能从数据库中选择它。我得到了这个例外:

代码语言:javascript
复制
java.lang.NumberFormatException: For input string: "PO"

然后,我在polygon字段的顶部添加了以下注释:

代码语言:javascript
复制
@Type(type = "org.hibernate.spatial.JTSGeometryType")

但它抛出了另一个异常,说明此类型不能实例化:

代码语言:javascript
复制
org.hibernate.MappingException: Could not instantiate Type: org.hibernate.spatial.JTSGeometryType

请注意,我使用的是5.1.0最终版本,用于hibernate和hibernate-spatial。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2016-10-21 11:50:30

hibernate-spartial 5.x似乎知道如何在本地处理JTS几何类型,因此不需要类型注释。这是我的工作配置。

代码语言:javascript
复制
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-spatial</artifactId>
  <version>5.2.3.Final</version>
</dependency>

MySQL表...

代码语言:javascript
复制
CREATE TABLE `stuff` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `coordinates` point NOT NULL,
  PRIMARY KEY (`id`),
  SPATIAL KEY `coordinates` (`coordinates`)
)

JPA实体...

代码语言:javascript
复制
import com.vividsolutions.jts.geom.Point;
...

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

冬眠方言。

代码语言:javascript
复制
<property name="hibernate.dialect" value="org.hibernate.spatial.dialect.mysql.MySQLSpatialDialect"/>

以上就是全部内容,但请注意,我的应用程序在WildFly 10中运行,它提供了额外的运行时依赖项,如MySQL驱动程序。

票数 8
EN

Stack Overflow用户

发布于 2016-06-03 20:07:40

您还应该尝试给出列名

代码语言:javascript
复制
@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开始,只有Geometry类型被指定为Hibernate,因此@Column注释必须设置columnDefinition="Geometry",而不是Point或其他任何内容。这可能会在将来得到修复。

有了这一系列的修改,我终于可以向数据库中写入一个Point了!正确的属性规范是:

代码语言:javascript
复制
 @Column(columnDefinition="Geometry")
 @Type(type = "org.hibernate.spatial.GeometryType")
 private Point centerPoint;

还要检查hibernate.cfg.xml中的方言

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

代码语言:javascript
复制
<property name="dialect">org.hibernate.spatial.dialect.postgis.PostgisDialect</property>
票数 0
EN

Stack Overflow用户

发布于 2016-10-21 03:39:13

我降级到了hibernate-spatial 4.3版本。请看我下面的配置。

实体列:

代码语言:javascript
复制
@Column(columnDefinition = "Geometry")
@Type(type = "org.hibernate.spatial.GeometryType")
private Polygon polygon;

Polygon类可以在com.vividsolutions.jts.geom包中找到。

依赖关系:

代码语言:javascript
复制
<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>

存储库:

代码语言:javascript
复制
<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方言:

代码语言:javascript
复制
org.hibernate.spatial.dialect.postgis.PostgisDialect
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37612951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档