отображение спящего режима для postgresql "отметка времени без часового пояса"? - PullRequest
1 голос
/ 13 июня 2009

Я пытаюсь сопоставить 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 ()) обрабатываются как "метка времени с часовым поясом".

Итак: я делаю что-то не так в моем спящем отображении? Это проблема с функцией?

1 Ответ

0 голосов
/ 13 июня 2009

Я недостаточно знаю Hibernate, чтобы комментировать эту часть, но вы, возможно, могли бы обойти ошибку, переопределив типы данных в операторе INSERT:

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

Вам, вероятно, не нужно переопределять все поля, конечно, только те, которые вызывают проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...