2009-06-13 73 views
1

我試圖將java.util.Date映射到沒有時區類型的postgresql時間戳。我正在使用自定義的sql-insert語句(因爲表是分區的,postgresql不會返回正常插入時更新的行數),並且我不斷收到一個錯誤,指出函數不存在。我懷疑這是由於映射這些日期字段的問題。休眠映射postgresql「沒有時區的時間戳」?

從Hibernate映射:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping default-lazy="false"> 
    <class ...snip... 
     <property name="dateCreated" type="timestamp"> 
      <column name="DATE_CREATED"/> 
     </property> 
     <property name="dateUpdated" type="timestamp"> 
      <column name="DATE_UPDATED"/> 
     </property> 
...snip... 
     <sql-insert callable="true">{call insert_wal (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}</sql-insert> 
    </class> 
</hibernate-mapping> 

從應用程序日誌:

Hibernate: 
    {call insert_wal (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)} 
12/06/09 17:22:15.409 WARN hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: null 
12/06/09 17:22:15.425 ERROR hibernate.util.JDBCExceptionReporter - Batch entry 0 select * from insert_wal (foo, 439, ...snip... 2009-06-12 17:22:15.315000 -07:00:00, 2009-06-12 17:22:15.378000 -07:00:00, ...snip...) as result was aborted. Call getNextException to see the cause. 
12/06/09 17:22:15.425 WARN hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 42883 
12/06/09 17:22:15.425 ERROR hibernate.util.JDBCExceptionReporter - ERROR: function insert_wal(character varying, integer, ...snip... unknown, unknown, ...snip...) does not exist 
12/06/09 17:22:15.425 ERROR event.def.AbstractFlushingEventListener - Could not synchronize database state with session 

(從第一誤差行引用的getNextException返回的異常簡單地重複用棧跟蹤第二誤差線)。正如你所看到的,出於某種原因,函數簽名JDBC正在尋找具有「未知」作爲時間戳的數據類型。我已經嘗試過所有可以想到的屬性類型和列sql-type的組合,但每次都顯示爲「未知」。下面是在DB函數定義的簽名:

CREATE OR REPLACE FUNCTION insert_wal(p_action character varying, p_partner_id numeric, ...snip... p_date_created timestamp without time zone, p_date_updated timestamp without time zone, ...snip... 

其他唯一的區別是,那裏是在函數定義一個「數字」,錯誤行顯示了不同類型,如「整數」,「雙精度」 ,和「bigint」;並且函數定義中的一個參數是類型「text」,其中錯誤顯示「字符變化」。

我可以通過調用pgAdminIII中的函數來產生類似的錯誤,只不過它是字符串值(例如'foo'帶引號)「未知」,而日期值(我剛剛使用now())是視爲「帶時區的時間戳」。

所以:我在我的hibernate映射中做錯了什麼?這是功能的問題嗎?

回答

0

我不知道休眠足夠的那部分發表評論,但你也許可以解決的錯誤在INSERT語句重寫數據類型:

<sql-insert callable="true">{call insert_wal (?::text, ?::numeric, <snip>?::timestamp,)::timestamp, <snip>)}</sql-insert> 

你可能不需要重寫所有的領域,當然,只是那些造成問題。

+0

我最終覆蓋了所有的字段(也許我只需要重寫數字字段,但我厭倦了試驗和錯誤),它的工作。謝謝! – 2009-06-15 22:59:34