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

PostGIS几何保存:"遇到无效的尾端标志值。"

云文栋
2023-03-14

我有一个Spring Roo Hibernate项目,它从客户端应用程序获取JTS众所周知的文本(WKT)字符串输入,将其转换为JTS几何对象,然后尝试将其写入PostGIS数据库。我在JDBC连接和类型方面遇到了一些问题,但是这些问题似乎已经通过以下方式解决了:

@Column(columnDefinition = "Geometry", nullable = true) 
private Geometry centerPoint;

转换确实:

Geometry geom = new WKTReader(new GeometryFactory(new PrecisionModel(), 4326)).read(source);

然而,现在当Hibernate试图将我的几何对象写入数据库时,我得到一个错误:

2012-08-31 21:44:14,096 [tomcat-http--18] ERROR org.hibernate.util.JDBCExceptionReporter - Batch entry 0 insert into land_use (center_point, version, id) values ('<stream of 1152 bytes>', '0', '1') was aborted.  Call getNextException to see the cause.
2012-08-31 21:44:14,096 [tomcat-http--18] ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: Invalid endian flag value encountered.

很明显,这个错误与二进制表示有关,它可能是作为一个已知的二进制(WKB)生成的,具有一定的endianness。然而,由于Hibernate隐藏了所有的持久性,我真的不知道事情的发展方向。

我已经和几何学斗争了好几天,关于这些错误的信息很少,所以有人有什么好主意吗?我可以在某个地方指定endianness(Hibernate或PostGIS),或者以不同的格式(WKT)存储吗?

编辑:我还应该提到,我正在使用最新的一切,这通常似乎是兼容的:

  • Spring3.1。1,Roo1.2。1

Hibernate Sspace al 4教程建议我将属性注释作为:

@Type(type="org.hibernate.spatial.GeometryType")
private Geometry centerPoint;

... 但是当我这样做的时候,我得到了另一个错误,当前注释解决了这个错误。

共有3个答案

伯向晨
2023-03-14

Pilladooo的解决方案适用于Spring引导2.0.3,Hibernate/空间5.2.17。最后,Postgres 9.5。

在我的例子中,实体中的列被定义为@Column(name=“geometry”)私有几何体;

并在数据库中键入'几何'(以避免由Hibernate自动生成的茶类型)

首先,我通过添加columnDefinition=“geometry”解决了“遇到的endian标志值无效”的问题,但之后hibernate将无法通过模式验证,“模式验证:在表[my_shema.my_geometry_table]的[geometry]列中遇到错误的列类型”;找到了[geometry(Types#OTHER)],但应为[bytea(Types#VARBINARY)]”

添加Spring后。jpa。财产。冬眠方言=组织。冬眠空间的地方话波斯特吉斯。最后,它终于起作用了。列定义现在也是多余的

慕容耘豪
2023-03-14

解决方案似乎如下:
@ColVIII将字段映射到所需的列,并使用JPA注释
@Type指定带有方言的Hibernate映射。

@Column(columnDefinition = "Geometry", nullable = true) 
@Type(type = "org.hibernate.spatial.GeometryType")
public Point centerPoint;

您可以在hibernate.cfg.xml文件中添加Hibernate属性来查看db请求,并尝试使用基于文本的编辑器(如带有“UTF-8”/“ANSI”/“其他字符集”的记事本)来捕获字符串编码问题

<!--hibernate.cfg.xml -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>

要添加hibernate属性,您将有一个hibernate。cfg。包含以下内容的xml文件。不要复制/粘贴它,因为它是面向MySQL的。只要看看我在哪里插入了我之前提到的属性。

 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE hibernate-configuration PUBLIC
 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 <hibernate-configuration>
      <session-factory>
           <property name="hibernate.bytecode.use_reflection_optimizer">true</property>
           <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
           <property name="hibernate.connection.password">db-password</property>
           <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db-name</property>
           <property name="hibernate.connection.username">db-username</property>
           <property name="hibernate.default_entity_mode">pojo</property>
           <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
           <property name="hibernate.format_sql">true</property>
           <property name="hibernate.search.autoregister_listeners">false</property>
           **<property name="hibernate.show_sql">true</property>**
           <property name="hibernate.use_sql_comments">false</property>

           <mapping ressource="...." />
           <!-- other hbm.xml mappings below... -->

      </session-factory>
 </hibernate-configuration>

记录所有sql的另一种方法是在log4j中添加特定于包的属性。属性文件:

log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE

祝你好运

甄坚白
2023-03-14

我解决这个问题添加到application.properties一行:

spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisDialect
 类似资料:
  • 问题内容: 我有一个Spring Roo + Hibernate项目,该项目需要从客户端应用程序输入JTS知名文本(WKT)字符串,然后将其转换为JTSGeometry对象,然后尝试将其写入PostGIS数据库。我在JDBC连接和类型方面遇到了一些问题,但这些问题似乎已通过以下方式解决: 转换完成: 但是现在,当Hibernate尝试将我的Geometry对象写入数据库时​​,我得到一个错误: 似

  • 我咨询了很多问题,还是找不到解决我问题的办法。 我正在做一个应用程序,其中一些类具有几何图形或点类型的属性,但在做持久性测试时,一切都很顺利,直到我尝试保存一个点。 我想补充一点,我需要使用这种类型的几何图形(导入org.locationtech.jts.geom.point;)我找到的所有解决方案都是使用类型(import com.vividsolutions.jts.geom.point;)

  • 我正在做一个jsf项目(2.2版)。我在javascript中有一个GeoJson对象。另一边我有一个列与类型的测地(MultiPolygon,4326)在PostGIS.我使用的是Hibernate 4.3.8和Postgreql 9.3。 模型类中的几何图形列定义 我还将Hibernate Sspace al 4. x包含到我的项目中,我可以在托管bean中访问Geojson字符串。但是我不知

  • 我有几个使用Spring Data JPA的实体类。(这些实体类位于安装了postgis的postgres db中,并包含几何字段。) 然而,当我切换到r2dbc时,它不起作用。任何提示都将不胜感激。 错误原因:java.lang.IllegalStateException:未找到类org.locationtech.jts.geom.Geometry的必需标识符属性!

  • POSTGIS=“2.5.4” [扩展] PGSQL=“120” GEOS=“3.8.1-CAPI-1.13.3” PROJ=“Rel. 6.3.2, May 1st, 2020” GDAL=“GDAL 3.0.4, 2020/01/28 发布” LIBXML=“2.9.7” LIBJSON=“0.13.1” LIBPROTOBUF=“1.3.0” RASTER Java Postgis Depe

  • 我正在尝试查询一组多边形(在运行时传入)中的任何一个是否与存储在数据库中“enclosing_polygons”字段中的一组多边形相交,这是一个 MultiPolygonField。 下面是查询的示例: 这个查询可以很好地处理硬编码的值,但是当我试图参数化它时,Postgres似乎不能识别?当我试图填充多边形点时,将它们作为参数。 当我设置前两个参数(针对field1和field2)时,这些JDB