有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用postgis和hibernatespatial正确映射多边形类型?

假设我有下表

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。hibernate和hibernate spatial的最终版本

多谢各位


共 (3) 个答案

  1. # 1 楼答案

    似乎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驱动程序

  2. # 2 楼答案

    您也应该尝试给出列名

    @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

    将以下行添加到休眠。cfg。xml

    <property name="dialect">org.hibernate.spatial.dialect.postgis.PostgisDialect</property>
    
  3. # 3 楼答案

    我降级到HibernateSpatial 4.3版本。请参阅下面我的配置

    实体列:

    @Column(columnDefinition = "Geometry")
    @Type(type = "org.hibernate.spatial.GeometryType")
    private 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