我有一个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;
...但我这样做时,我得到这个其他错误 ,它在当前的注释解决。
该解决方案似乎是以下几点:
@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
祝好运!
我解决这个问题,增加了“application.properties”这一行:
spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisDialect
又见, http://trac.osgeo.org/postgis/ticket/1830一个问题出现了,周围用Postgres的工具pgsql2shp时,这引起了同样的“无效尾数标志”的错误PostgreSQL的9XX和POSTGIS 2XX出来的时间。 它可以固定在去除库libpq.so的旧版本,因为它是由于Postgres的改变BYTEA的默认行为。