2009-06-13 87 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