Я пытаюсь сопоставить java.util.Date с меткой времени postgresql без типа часового пояса. Я использую пользовательский оператор sql-insert (поскольку таблица разбита на разделы, а postgresql не возвращает количество строк, обновленных при обычной вставке), и я получаю сообщение об ошибке, в котором говорится, что функция не существует. Я подозреваю, что это связано с проблемой сопоставления этих полей даты.
Из карты гибернации:
<?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, на которое ссылается первая строка ERROR, просто повторяет вторую строку ERROR с трассировкой стека.) Как видите, по какой-то причине искомая сигнатура функции JDBC имеет "unknown" в качестве типов данных куда идут метки времени Я пробовал каждую комбинацию типа свойства и столбца sql-type, о которой только мог подумать, но каждый раз он отображается как «неизвестный». Вот подпись определения функции в БД:
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»; и одним параметром в определении функции является тип «текст», где ошибка показывает «изменение символа».
Я могу выдать похожую ошибку, вызвав функцию в pgAdminIII, за исключением того, что строковые значения (например, 'foo' с кавычками) являются "неизвестными", тогда как значения даты (я только что использовал now ()) обрабатываются как "метка времени с часовым поясом".
Итак: я делаю что-то не так в моем спящем отображении? Это проблема с функцией?