当前位置: 首页 > 知识库问答 >
问题:

在PostgreSQL和JPA/Hibernate中使用点类型

濮阳鸿祯
2023-03-14

有没有办法将点列映射到Java实体字段?

我尝试了Hibernate空间4.0,但似乎它不适用于没有PostGIS的纯PostgreSQL。这里是点字段定义:

import com.vividsolutions.jts.geom.Point;
...
@Column(columnDefinition = "point")
@Type(type = "org.hibernate.spatial.GeometryType")
private Point location;

persistence.xml方言:

<property name="hibernate.dialect"  value="org.hibernate.spatial.dialect.postgis.PostgisDialect" />

当我尝试持久化这个实体时,会引发异常:

org.postgresql.util.PSQLException: Unknown type geometry.
at org.postgresql.jdbc2.AbstractJdbc2Statement.setPGobject(AbstractJdbc2Statement.java:1603)
at org.postgresql.jdbc2.AbstractJdbc2Statement.setObject(AbstractJdbc2Statement.java:1795)
at org.postgresql.jdbc3g.AbstractJdbc3gStatement.setObject(AbstractJdbc3gStatement.java:37)
at org.postgresql.jdbc4.AbstractJdbc4Statement.setObject(AbstractJdbc4Statement.java:46)
at org.hibernate.spatial.dialect.AbstractJTSGeometryValueBinder.bind(AbstractJTSGeometryValueBinder.java:48)
at org.hibernate.spatial.dialect.AbstractJTSGeometryValueBinder.bind(AbstractJTSGeometryValueBinder.java:39)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:275)
at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:57)

因此,它似乎试图将价值作为PostGIS的几何类型。但是我想用简单的Point。

共有3个答案

壤驷鸿
2023-03-14

我可以通过@嵌入式实体提供一种更通用的方法(它不取决于数据库类型!),我在项目中使用过。

示例如下:

使用LAT和LONG创建一些表的SQL查询:

CREATE TABLE some_table (
  lat    NUMBER(..., ...),
  long   NUMBER(..., ...),
...
);

嵌入式点实体:

@Embeddable
public class Point {
    private BigDecimal x;
    private BigDecimal y;
 ...
}

您的自定义实体:

@Entity
@Table(name = "some_table")
public class SomeEntity {
    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "lat", column = @Column(name = "x")),
            @AttributeOverride(name = "long", column = @Column(name = "y"))
    })
    private Point point;
...
}
罗渝
2023-03-14

你应该尝试在你的数据库中的类型作为几何,我也没有设法用mySQL做到这一点。几何作品作为罚款的点...

蒲昊苍
2023-03-14

在您的数据库中安装POSTGIS扩展。

您遇到的错误是因为您尚未在数据库上安装任何与Hibernate相关的内容。是postgres在抱怨,即:

组织。postgresql。util。PSQLException:未知类型的几何体。

您的注释和配置说明它们依赖于PostGIS:

<property name="hibernate.dialect"  value="org.hibernate.spatial.dialect.postgis.PostgisDialect" />

所以基本上,您正在尝试使用不受支持的配置。

PostgreSQL并不像Oracle那样提供任何人都能想到的所有可能的数据类型。所以当Hibernate说“我想要一个‘几何体’时,PostgreSQL只是说“什么是几何体?”?“PostgreSQL是非常可扩展的,所以PostGIS的人就是这么做的——他们构建了一个扩展。任何人都可以安装它或完全不用它运行。它造成的唯一问题是有人希望它出现在开箱即用的数据库中,而不是作为一个附加组件

我想您可能会尝试对PostgreSQL数据类型进行反向工程,并在数据库中编译它们。Geometry是PostGIS的主超类,至少在Java中是这样,在数据库中也是如此。我只是不明白为什么你会在没有人支持的情况下设置配置。

@这有帮助吗?

 类似资料:
  • 问题内容: 有没有一种方法可以将Point列映射到Java实体字段? 我尝试了Hibernate Spatial 4.0,但似乎没有PostGIS的纯PostgreSQL就无法使用。这是点字段定义: persistence.xml中的方言: 当我尝试保留该实体时,会引发异常: 似乎它试图将值保留为PostGIS的Geometry类型。但是我只想使用简单的Point。 问题答案: 您应该尝试在数据库

  • 问题内容: 我正在尝试将Postgres自定义类型(名为transmission_result)映射到Hibernate / JPA POJO。postgres自定义类型或多或少是字符串值的枚举类型。 我创建了一个名为PGEnumUserType的自定义EnumUserType以及一个表示postgres枚举值的枚举类。当我对一个真实的数据库运行它时,我收到以下错误:’ERROR:列“状态”的类型

  • 问题内容: 我们对PostgreSQL中的继承以及在JPA中将其映射为实体存在疑问。我们的数据库和我们要映射的表是: 我们在Netbeans 7.1.2中使用自动工具将它们映射到实体。起初我认为仅添加就足够了 因此,它只是 扩大了 ,但无法正常工作。最好的方法是什么?提前致谢。 问题答案: JPA的继承概念基于普通表。它并没有真正“理解” PostgreSQL表继承的想法。这是使用旨在暴露功能的最

  • 问题内容: 我有一个使用SchemaUpdate的主要方法,可以在控制台上显示要更改/创建的表,并且在我的Hibernate项目中可以正常工作: 我想在JPA项目中重用此代码,它没有hibernate.cfg.xml文件(也没有.properties文件),但是有一个persistence.xml文件(如JPA规范指定的在META- INF目录中自动检测到) 。 我尝试了这种过于简单的调整, 但由

  • 问题内容: 好吧,我正在尝试使用JPA + Hibernate + Spring首次配置C3P0。在persistence.xml中,我有: 但是,当我尝试初始化tomcat时,出现以下错误: 编辑1: 这是我的applicationContext.xml,如何在其中配置C3P0呢? 问题答案: 您的配置有缺陷。您正在应用程序上下文中进行配置。因此,基本上所有属性都是无用的,其次,该属性的设置破坏

  • 问题内容: 我试图在使用UUID作为主键的PostgreSQL中保留一个实体。我尝试将其持久保存为普通的UUID: 有了以上,我得到这个错误: 我也尝试将UUID保留为byte []无济于事: 如果删除@Lob,我得到的错误与上面发布的错误相同。但是使用@Lob时,错误会稍微更改为: 无法完成如此简单的操作,我感到非常难过! 我正在将Hibernate 4.1.3.Final与PostgreSQL