【问题标题】:How to correctly map a polygon type with postgis and hibernate-spatial?如何使用 postgis 和 hibernate-spatial 正确映射多边形类型?
【发布时间】:2016-10-03 10:27:38
【问题描述】:

假设我有下表

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 版本进行休眠和休眠空间。

谢谢

【问题讨论】:

    标签: java hibernate postgresql postgis hibernate-spatial


    【解决方案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】:

      你也应该尝试给列名

      @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 或其他任何东西。将来可能会解决此问题。

      有了这本修改集,我终于可以写一个指向数据库的点了!正确的属性规范是:

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

      【讨论】:

      • 感谢@Parth,但是hibernate-spatial 5.x 中没有org.hibernate.spatial.GeometryType
      • 您是否在 persistence.xml 文件中添加了正确的方言。 &lt;property name="hibernate.dialect" value="org.hibernatespatial.postgis.PostgisDialect"/&gt;
      • 也可以是type="org.hibernatespatial.GeometryUserType"
      【解决方案3】:

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

      【讨论】:

      • 有趣的是,我发现 hibernate-spartial 5.x 实际上知道如何本地处理 JTS 类型,因此不需要类型注释。我也会发布我的解决方案。
      • 我真的不想降级,因为我运行的应用程序服务器提供了休眠 5.x,我宁愿不摆弄它。
      猜你喜欢
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      • 2014-11-17
      • 2012-08-22
      相关资源
      最近更新 更多