【发布时间】:2012-08-31 12:17:24
【问题描述】:
我有一个 Spring Roo + Hibernate 项目,它从客户端应用程序获取 JTS 知名文本 (WKT) 字符串输入,将其转换为 JTS Geometry 对象,然后尝试将其写入 PostGIS 数据库。我对the JDBC connection and types 有一些问题,但这些问题似乎已通过以下方式解决:
@Column(columnDefinition = "Geometry", nullable = true)
private Geometry centerPoint;
转换确实如此:
Geometry geom = new WKTReader(new GeometryFactory(new PrecisionModel(), 4326)).read(source);
但是现在当 Hibernate 尝试将我的 Geometry 对象写入数据库时,我得到一个错误:
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.
似乎很明显,该错误与二进制表示有关,它可能是生成为带有一些endianness 的众所周知的二进制 (WKB)。然而,由于 Hibernate 隐藏了所有的持久性,我真的无法判断事情的发展方向。
我已经与这个几何问题作斗争好几天了,关于这些错误的信息很少,所以有人有什么好主意吗?我可以在某处(Hibernate 或 PostGIS)指定字节顺序,或者以不同的格式(WKT)存储吗?
编辑:我还应该提到,我使用的是最新的,通常似乎是兼容的:
- 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(不是最新的,而是recommended for hibernate-spatial,编译自源码)
- postgis-jdbc 2.0.1(刚刚尝试了这个来匹配安装PostgreSQL的版本,同样的问题)
Hibernate Spatial 4 tutorial 建议我将属性注释为:
@Type(type="org.hibernate.spatial.GeometryType")
private Geometry centerPoint;
...但是当我这样做时,我得到this other error,当前注释已解决。
【问题讨论】:
-
您好,我关注您的 OpenGIS 问题 :) 您是否尝试过两次方法
@Type(type="org.hibernate.spatial.GeometryType")注释加上 JPA 注释@Column(columnDefinition = "Geometry", nullable = true)关联到同一字段。 -
其他库也有类似geodb issue n°5 的问题。我建议你应该试试 postgis 测试套件,看看你是否遇到同样的问题。这看起来像是字节序字符编码的问题,好的,但有时事情不像他们第一眼看到的那样。您是否尝试使用
getNextException()方法获得更多信息,或者您的日志的第二行就是您能得到的所有信息? -
我发现以下java hibernate postgis tutorial 建议按照我所说的去做。它是法语的,好的,但是如果您需要翻译,我可以提供帮助(我是法语,哈哈)。在建议的教程中,它简要解释了我在第一条评论中提到的每个注释的作用。看来您需要按照我的建议进行设置。
标签: spring hibernate geometry endianness jts