我正在尝试将java.util.Date映射到没有时区类型的postgresql时间戳。我正在使用自定义的sql-insert语句(因为表是分区的,而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
(从第一个ERROR行中引用的getNextException返回的异常只是重复带有堆栈跟踪的第二个ERROR行。)正如您所看到的,由于某种原因,JDBC正在寻找的函数签名具有“未知”作为数据类型时间戳去的地方。我已经尝试了我能想到的每种属性类型和列sql类型的组合,但它每次都显示为“未知”。这是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...
唯一的区别是,在函数定义中存在“数字”的情况下,ERROR行显示各种类型,如“整数”,“双精度”和“bigint”;函数定义中的一个参数是“text”类型,其中错误显示“字符变化”。
我可以通过调用pgAdminIII中的函数来产生类似的错误,除了它是“未知”的字符串值(例如带引号的'foo'),而日期值(我刚刚使用now())被处理作为“带时区的时间戳”。
所以:我在hibernate映射中做错了什么?这是函数的问题吗?
答案 0 :(得分:0)
我不知道Hibernate是否足以对该部分发表评论,但您可以通过覆盖INSERT语句中的数据类型来解决错误:
<sql-insert callable="true">{call insert_wal (?::text, ?::numeric, <snip>?::timestamp, )::timestamp, <snip>)}</sql-insert>
您可能不需要覆盖所有字段,当然,只是那些导致问题的字段。