PostGIS几何节约:“遇到无效尾数标志值”(PostGIS Geometry saving: “

2019-06-27 15:53发布

我有一个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)与一些产生字节顺序 。 然而与Hibernate隐藏所有的执着了,我真的不能告诉事情的进展哪种方式。

我一直争取这几天几何的东西,而且有很少的信息是在那里对这些错误,所以没有任何人有什么好主意? 我可以指定字节序的地方(休眠或PostGIS的),或者以不同的格式(WKT)存储?

编辑:我还想说,我使用的是最新的一切,这通常似乎是兼容的:

  • 春天3.1.1,1.2.1袋鼠
  • 3.6.9冬眠
  • 冬眠空间4.0-M1
  • JTS 1.12
  • PostgreSQL的9.1
  • PostGIS的-JDBC 1.5.3(不是最新的,但建议对休眠空间 ,从源代码编译)
  • PostGIS的-JDBC 2.0.1(只是尝试这样做,现在,以配合的PostgreSQL安装的版本,同样的问题)

在Hibernate的空间4教程建议我做的属性注解为:

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

...但我这样做时,我得到这个其他错误 ,它在当前的注释解决。

Answer 1:

该解决方案似乎是以下几点:
@Column到字段映射到与JPA注释所需的列
@Type指定与方言的Hibernate映射。

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

你可以在其中添加Hibernate属性hibernate.cfg.xml文件里面看到该数据库请求,并试图抓住用文本编辑器基础上如记事本++与“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的导向。 只要看看在那里我已经插入我以前evocated属性。

 <?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文件里包的特定属性:

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

祝好运!



Answer 2:

我解决这个问题,增加了“application.properties”这一行:

spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisDialect


Answer 3:

又见, http://trac.osgeo.org/postgis/ticket/1830一个问题出现了,周围用Postgres的工具pgsql2shp时,这引起了同样的“无效尾数标志”的错误PostgreSQL的9XX和POSTGIS 2XX出来的时间。 它可以固定在去除库libpq.so的旧版本,因为它是由于Postgres的改变BYTEA的默认行为。



文章来源: PostGIS Geometry saving: “Invalid endian flag value encountered.”