将点类型与 PostgreSQL 和 JPA/Hibernate 一起使用

2022-09-02 10:05:50

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

我尝试过Hibernate Spatial 4.0,但似乎它不适用于没有PostGIS的纯PostgreSQL。下面是点字段定义:

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

方言在持久性.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的几何类型。但我只想使用简单的点。


答案 1

在数据库中安装 POSTGIS 扩展。

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

org.postgresql.util.PSQLException: Unknown type geometry.

您的注记和配置表明它们依赖于 PostGIS:

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

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

PostgreSQL并没有像Oracle那样提供任何人都想到的所有可能的数据类型。因此,当Hibernate说“我想要一个'几何'时,PostgreSQL只是说”什么是几何?PostgreSQL非常具有可扩展性,所以这就是PostGIS人员所做的 - 他们构建了一个扩展。任何人都可以在没有它的情况下安装或完全运行它。它导致的唯一问题是,当有人期望它在开箱即用的数据库中而不是它是一个附加组件时。

我想你可能会尝试对PostgreSQL数据类型进行逆向工程,并在你的数据库中编译它们。Geometry是PostGIS的主超类,至少在Java中是这样,它在数据库中看起来是一样的。我只是不明白为什么你会设置一个配置,而你永远不会让任何人支持它。

这有什么帮助@bluish?


答案 2

你应该尝试在你的数据库中将类型作为Geometry,我也没有设法用mySQL做到这一点。几何图形对点工作正常。


推荐