我有一个 Spring Roo + Hibernate 项目,它从客户端应用程序获取 JTS 众所周知的文本 (WKT) 字符串输入,将其转换为 JTS 几何对象,然后尝试将其写入 PostGIS 数据库。我遇到了一些问题JDBC 连接和类型 https://stackoverflow.com/questions/12156130/hibernate-spatial-no-dialect-mapping-for-jdbc-type-3000/,但这些似乎已通过以下方式解决:
@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)生成的,其中包含一些字节顺序 http://edndoc.esri.com/arcsde/9.0/general_topics/wkb_representation.htm。然而,由于 Hibernate 隐藏了所有持久性,我无法真正判断事情的发展方向。
我已经和这个几何问题斗争了好几天了,关于这些错误的信息很少,所以有人有什么好主意吗?我可以在某处指定字节顺序(Hibernate 或 PostGIS),或者以不同的格式存储(WKT)吗?
EDIT:我还应该提到,我正在使用最新的一切,通常看起来是兼容的:
- 春季 3.1.1、袋鼠 1.2.1
- 休眠3.6.9
- 休眠空间 4.0-M1
- jts 1.12
- PostgreSQL 9.1
- postgis-jdbc 1.5.3(不是最新的,但是推荐用于休眠空间 http://www.hibernatespatial.org/dependencies.html,从源代码编译)
- postgis-jdbc 2.0.1(现在刚刚尝试匹配与 PostgreSQL 安装的版本,同样的问题)
The Hibernate 空间 4 教程 http://www.hibernatespatial.org/tutorial-hs4.html建议我将属性注释做为:
@Type(type="org.hibernate.spatial.GeometryType")
private Geometry centerPoint;
...但是当我这样做时我得到这个其他错误 https://stackoverflow.com/questions/12156130/hibernate-spatial-no-dialect-mapping-for-jdbc-type-3000/,当前注释解析。