我有一个 Spring Roo + Hibernate 项目,它从客户端应用程序获取 JTS 知名文本 (WKT) 字符串输入,将其转换为 JTS Geometry 对象,然后尝试将其写入 PostGIS 数据库。我在 JDBC 连接和类型方面遇到了一些问题,但这些问题似乎已通过以下方式解决:
@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.
很明显,该错误与二进制表示有关,该表示可能是作为具有某种字节顺序的众所周知的二进制 (WKB) 生成的。然而,由于 Hibernate 隐藏了所有的持久性,我真的无法判断事情的发展方向。
几天来我一直在与几何学的东西作斗争,关于这些错误的信息很少,所以有人有什么好主意吗?我可以在某处(Hibernate 或 PostGIS)指定字节顺序,或者以不同的格式(WKT)存储吗?
编辑:我还应该提到我正在使用最新的一切,这通常似乎是兼容的:
- 春天 3.1.1,Roo 1.2.1
- 休眠 3.6.9
- 休眠空间 4.0-M1
- 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;
...但是当我这样做时,我得到了另一个错误,当前注释解决了这个错误。