28

将 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-File 中。GeometryType 发生了什么以及如何替换它?或者是否还有另一个要包含的 jar 文件?

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

4

7 回答 7

38

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

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

来源

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

于 2015-09-20T15:15:51.860 回答
6

上面丹尼斯建议的解决方案在 Hiberate 5 空间和 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;
于 2016-01-20T13:07:16.893 回答
5

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

private Point location;

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

一些额外的细节并检查以上是否有效

  • 一旦你运行你的设置并 desc table_name在 mysql 中使用,你应该会看到geometry的字段类型。这表明您的休眠到数据库映射工作正常。
  • 现在尝试从 java 创建一个实体和 repo.save(entity) ,您的实体应该可以正常保存而没有任何错误。

如果上述设置效果不佳,您通常会收到错误消息

数据截断:无法从您发送到 GEOMETRY 字段的数据中获取几何对象 Blockquote

希望能帮助别人节省我浪费的 6 个小时!

于 2018-05-02T10:01:25.100 回答
4

所以我已经与这个问题作斗争了几天,问题是我希望数据库类型来自 postgis 类型,以便我对最近的邻居等运行有效的距离查询。我终于想出了如何去做并想与社区分享,所以我创建了一个包含问题解决方案的演示项目。

我的设置是一个带有 Postgis、Spring boot jpa、Hibernate 5+、Hibernate-spatial 5+ 的 PostgreSQL 数据库,还添加了转换为 rest 输出,这再次需要 jackson 的特殊模块。

该项目位于https://github.com/Wisienkas/springJpaGeo

您要求的重要代码是:

@type(type = "jts_geometry")
private Point point;
于 2017-05-01T12:04:40.283 回答
1

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

我正在使用 postgis / springboot / hibernate-spatial。

最初 Hibernate-Spatial 是 @ 5.4.10.Final,即使使用这里的解决方案也无法正常工作。

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

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

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

@Column(name="domain_loc")
private Geometry location;
于 2020-02-02T00:17:22.013 回答
0

我正在使用休眠 4.3.6 和休眠空间 5.2.2。上面建议的解决方案对我不起作用。但是,如果我添加休眠空间 4.3,则以下代码有效

@Type(type="org.hibernate.spatial.GeometryType")
private Point location;
于 2016-10-04T11:00:00.737 回答
0

对我来说,数据按预期存储在 PostgreSQL 中,但是使用 REST API 检索它失败并出现反序列化错误。这就是 PostgreSQL 12 和 Spring Boot 对我有用的。

将其包含在 application.properties 文件中

spring.jpa.database-platform=org.hibernate.spatial.dialect.postgis.PostgisDialect

pom.xml 更改

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.4.20.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-spatial</artifactId>
    <version>5.4.20.Final</version>
</dependency>
<dependency>
    <groupId>org.n52.jackson</groupId>
    <artifactId>jackson-datatype-jts</artifactId>
    <version>1.2.9</version>
</dependency>

使用 @Configuration 注解创建下面的 Bean

import org.n52.jackson.datatype.jts.JtsModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfig {

    @Bean
    public JtsModule jtsModule() {
        return new JtsModule();
    }

}

在你的 @Entity 类中,确保

import org.n52.jackson.datatype.jts.GeometryDeserializer;
import org.n52.jackson.datatype.jts.GeometrySerializer;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import org.locationtech.jts.geom.Point;
    
@Column(name="the_geom", columnDefinition = "POINT")
@JsonSerialize(using = GeometrySerializer.class)
@JsonDeserialize(contentUsing = GeometryDeserializer.class)
private Point point;

在这些更改之后,我的 Rest API 以预期的格式返回数据

"point": {
            "type": "Point",
            "coordinates": [
                53.85151,
                -1.55973
            ]
        }
于 2021-09-13T07:26:31.413 回答