Java Hibernate Spatial 5-几何类型

Java Hibernate Spatial 5-几何类型,java,hibernate,postgis,hibernate-spatial,Java,Hibernate,Postgis,Hibernate Spatial,将Hibernate spatial升级到5.0.0.CR2版后,以下声明不再有效: @Column(columnDefinition = "geometry(Point,4326)") @Type(type = "org.hibernate.spatial.GeometryType") private Point position; 带有: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable t

将Hibernate spatial升级到5.0.0.CR2版后,以下声明不再有效:

@Column(columnDefinition = "geometry(Point,4326)")
@Type(type = "org.hibernate.spatial.GeometryType")
private Point position;
带有:

org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [org.hibernate.spatial.GeometryType]
正如我所看到的,这个类不再存在于Jar文件中。GeometryType发生了什么?它是如何被替换的?或者是否还有另一个jar文件要包含


编辑:澄清。我将Hibernate Spatial与PostgreSQL Postgis数据库结合使用。

这个解决方案太容易看到了。只需删除@Type注释,声明如下所示:

@Column(columnDefinition = "geometry(Point,4326)")
private Point position;
:

请注意@Type注释。这将通知Hibernate位置属性的类型为Geometry。@Type注释是特定于Hibernate的,并且是唯一需要的非JPA注释。(在Hibernate的未来版本(版本5及更高版本)中,不再需要显式声明几何体值属性的类型。)


上面Denis建议的解决方案在Hibrate 5 spatial和Mysql上对我不起作用。但是,以下注释对我有效

  @Column(name = "location",columnDefinition="Geometry")
  private Geometry location;


  @Column(name = "pointlocation",columnDefinition="Point")
  private Point pointlocation;
如果您正在运行Hibernate 5.3+,则可以跳过列定义

  @Column(name = "location")
  private Geometry location;


  @Column(name = "pointlocation")
  private Point pointlocation;

我正在使用hibernate 4.3.6和hibernate spatial 5.2.2。上面建议的解决方案对我不起作用。 但是,如果我添加hibernate spatial 4.3,下面的代码可以工作

@Type(type="org.hibernate.spatial.GeometryType")
private Point location;

所以我已经和这个问题斗争了几天,问题是,我希望数据库类型来自postgis类型,以便为最近的邻居等运行有效的距离查询。我最终找到了方法,并希望与社区共享,因此我创建了一个包含问题解决方案的演示项目

我的设置是一个带有Postgis、Spring boot jpa、Hibernate 5+、Hibernate spatial 5+的PostgreSQL数据库,还添加了转换到rest输出的功能,这同样需要jackson提供的特殊模块

该项目位于

您要求的重要代码是:

@type(type = "jts_geometry")
private Point point;

对于Hibernate Spatial 5.2.x,您所需要的只是实体中的以下内容

专用点定位

您不需要像上面提到的解决方案那样使用columnDefinition或Type

一些额外的细节和检查,看看是否上述工程

  • 一旦运行安装程序并在mysql中使用
    desc table\u name
    ,您就会看到geometry的字段类型。这表明hibernate到数据库的映射工作正常
  • 现在试着从java创建一个实体和repo.save(实体),您的实体应该保存得很好,没有任何错误
如果上面的设置无法正常工作,通常会出现错误

数据截断:无法从发送到“几何体”字段的数据中获取几何体对象 大宗报价


希望能帮别人省下我浪费的6个小时

显然,您的Hibernate库也需要相同的版本

我使用的是postgis/springboot/hibernatespatial

最初,Hibernate Spatial是@5.4.10.Final,甚至与这里的解决方案都不起作用

然后,我查看了maven依赖项(hibernate-commons-annotations-5.1.0.Final.jar)中的hibernate版本,并记得看到了hibernate版本需要匹配的地方

因此,我将Hibernate Spatial降级为5.1,以下映射语句在没有任何更多信息的情况下工作:

// Geometry Object is from the following import
import com.vividsolutions.jts.geom.*;

@Column(name="domain_loc")
private Geometry location;

Hibernate文档和其他所有文章都不适用于Hibernate 5,但您的答案确实适用!谢谢我还必须使用正确的
GeometryFactory
来创建
对象。使用
new GeometryFactory(new PrecisionModel(),4326)
对我很有效。“jts\U几何体”是什么类型的?我以为这个值应该是一个完全限定的类名?找到了引用:完美,正是我想要的。上面的其他答案对Hibernate 5.3不起作用,只要我删除了columnDefinition,它就工作得很好。这一个,帮了我你救了我!我刚做了一些spring boot升级,它与hibernate一起升级。所以我只是检查了这些依赖项,并将hibernate spatial降级为5.1.0.Final。现在可以了!很高兴它也帮助了你!!