2012-08-31 42 views
3

我有一個Spring Roo + Hibernate項目,它從客戶端應用程序獲取JTS知名文本(WKT)字符串輸入,將其轉換爲JTS幾何對象,然後嘗試將其寫入PostGIS數據庫。我有一些問題the JDBC connection and types,但這些似乎已經解決:PostGIS幾何保存:「遇到無效的端標誌值。」

@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)產生一些endianness。然而,隨着Hibernate隱藏所有的持久性,我無法確定事情進展到哪個方向。

我幾天來一直在爲這個幾何形狀的東西而戰,而且這些錯誤信息很少,所以有人有什麼好的想法嗎?我可以在某處指定字節序(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(不是最新的,但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,其當前的註釋解決。

+0

你好,我按照你的問題與OpenGIS :) 你嘗試做兩次方法'@Type(type =「org.hibernate.spatial.GeometryType」)' 註釋加上JPA註釋'@Column columnDefinition =「Geometry」,nullable = true)'關聯到同一個字段。 – ThierryB

+0

其他館藏有類似[geodb issue n°5](https://github.com/jdeolive/geodb/issues/5)的問題。 我建議你應該嘗試postgis測試套件,以查看你是否遇到同樣的問題。 這看起來像一個endian字符編碼問題,好吧,但有時候事情並不像他們看第一隻眼睛。 您是否嘗試使用getNextException()方法獲取更多信息,或者日誌的第二行是您可以獲得的所有內容? – ThierryB

+1

我發現了下面這些[java hibernate postgis教程](http://www.clever-age.com/veille/blog/postgis-play-framework.html),它建議按照我所說的去做。這是法語,好的,但我可以幫助,如果你需要一個翻譯(我是法語大聲笑)。 在建議的教程中,它簡要地解釋了我在第一條評論中所記錄的每個註釋的作用。看來你需要按照我的建議設置它們。 – ThierryB

回答

6

溶液似乎是以下:
@Column到外地與JPA註解
@Type映射到所需的列來指定與方言Hibernate映射。

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

您可以添加hibernate.cfg.xml文件內休眠特性看DB請求,並試圖抓住用記事本等++基於文本的編輯字符串編碼的問題,「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的。只要看看我插入的是我之前提出的屬性。

<?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 

祝你好運!

+0

這當然可以修復endian問題,所以謝謝。然而,可以預見的是,我現在有*另一個*內部錯誤:'不能提交JPA事務;嵌套異常是javax.persistence.RollbackException:提交事務時出錯。堆棧跟蹤是無益的,讓hibernate配置標籤工作比預期更困難。這對你來說顯而易見,還是需要一個新的問題? – orlade

+0

你好,也許正在尋找任何@Transactional的東西。我今天沒有足夠的時間(象棋事件)。也許我明天可以幫助你。我將添加一個完整的休眠配置,以便您可以查看它。祝你好運! – ThierryB

+1

嗯。也許你的數據庫模型不允許你想要在數據庫中存儲的PostGIS對象所涉及的任何字段的空值。如果你運行一個斷點的項目並按下'F6'來一步一步地在你的java程序中執行,你將會看到什麼時候拋出異常。你可以擊中'F5'進入你想檢查的任何方法。查看使用eclipse和您正在使用的容器(Tomcat,JBoss,GlassFish等)配置遠程調試。 – ThierryB

1

另請參見http://trac.osgeo.org/postgis/ticket/1830 Postgresql 9xx和Postgis 2xx出現時出現問題,使用postgres實用程序pgsql2shp時會導致相同的「無效端標誌」錯誤。它可以固定刪除庫libpq.so的舊版本,因爲它是由於Postgres更改了bytea的默認行爲。