PostGIS 几何保存:“遇到无效的字节序标志值." [英] PostGIS Geometry saving: "Invalid endian flag value encountered."

查看:16
本文介绍了PostGIS 几何保存:“遇到无效的字节序标志值."的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 Spring Roo + Hibernate 项目,它从客户端应用程序获取 JTS 知名文本 (WKT) 字符串输入,将其转换为 JTS Geometry 对象,然后尝试将其写入 PostGIS 数据库.JDBC 连接和类型,但这些似乎已通过以下方式解决:

I have a Spring Roo + Hibernate project which takes a JTS well-known text (WKT) String input from the client application, converts it into a JTS Geometry object, and then attempts to write it to the PostGIS database. I had some problems with the JDBC connection and types, but these seem to have been resolved with:

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

转换确实如此:

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

但是现在当 Hibernate 尝试将我的 Geometry 对象写入数据库时​​,我得到一个错误:

However now when Hibernate tries to write my Geometry object to the database, I get an error:

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) 生成的,其中包含一些 字节序.然而,由于 Hibernate 隐藏了所有的持久性,我真的无法判断事情的发展方向.

It seems clear that the error is related to the binary representation, which is presumably generated as a well-known binary (WKB) with some endianness. However with Hibernate hiding all the persistence away, I can't really tell which way things are going.

我已经与这个几何问题作斗争好几天了,关于这些错误的信息很少,所以有人有什么好主意吗?我可以在某处指定字节顺序(Hibernate 或 PostGIS),或者以不同的格式(WKT)存储吗?

I've been fighting this Geometry stuff for days, and there's very little information out there on these error, so does anyone have any bright ideas? Can I specify the endianness somewhere (Hibernate or PostGIS), or perhaps store in a different format (WKT)?

我还应该提到,我使用的是最新的,通常看起来是兼容的:

I should also mention that I'm using the newest of everything, which generally seems to be compatible:

  • Spring 3.1.1,Roo 1.2.1
  • 休眠 3.6.9
  • 休眠空间 4.0-M1
  • jts 1.12
  • PostgreSQL 9.1
  • postgis-jdbc 1.5.3(不是最新的,但是推荐用于hibernate-spatial,从源代码编译)
  • postgis-jdbc 2.0.1(刚刚尝试了这个来匹配安装PostgreSQL的版本,同样的问题)

Hibernate Spatial 4 教程建议我将属性注释为:

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

...但是当我这样做时,我得到 此其他错误,当前注释已解决.

... but when I do this I get this other error, which the current annotation resolves.

推荐答案

解决办法好像是这样的:
@Column 使用 JPA 注释将字段映射到所需列
@Type 指定 Hibernate 与方言的映射.

The solution seems to be the following:
@Column to map the field to the desired column with JPA annotations
@Type to specify the Hibernate mapping with the dialect.

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

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

You could add the Hibernate property inside the hibernate.cfg.xml file to see the db request and try to catch the string-encoded problem with a text based editor like Notepad++ with "UTF-8"/"ANSI"/"other charsets"

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

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

To add the hibernate properties you will have an hibernate.cfg.xml file with the following stuff. Don't copy/paste it because it is MySQL oriented. Just look where I have inserted the properties I evocated previously.

 <?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.properties 文件中添加特定于包的属性:

Another way to log all sql is to add package specific properties inside a log4j.properties file:

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

祝你好运!

这篇关于PostGIS 几何保存:“遇到无效的字节序标志值."的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆