Ich versuche, java.util.Date postgresql Zeitstempel ohne Zeitzone Typ zuordnen. Ich verwende eine benutzerdefinierte sql-insert-Anweisung (weil die Tabelle partitioniert ist und postgresql nicht die Anzahl der Zeilen, die auf einer normalen Einfügung aktualisiert werden, zurückgibt), und ich bekomme immer einen Fehler, der besagt, dass die Funktion nicht existiert. Ich vermute, dass dies auf ein Problem beim Zuordnen dieser Datumsfelder zurückzuführen ist.Hibernate Mapping für Postgresql "Timestamp ohne Zeitzone"?
Von der Hibernate Mapping:
<?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>
Aus dem Anwendungsprotokoll:
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
(Die Ausnahme von getNextException in der ersten Fehlerzeile verwiesen zurück einfach wiederholt die zweite Fehlerzeile mit einem Stack-Trace .) Wie Sie sehen können, hat die Funktionssignatur, nach der JDBC sucht, "unbekannt" als Datentypen, wo die Zeitstempel liegen. Ich habe versucht, jede Kombination von Eigenschaftstyp und Spalte sql-Typ, die ich mir vorstellen kann, aber es erscheint als "unbekannt" jedes Mal. Hier ist die Signatur der Funktionsdefinition in der 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...
Die einzigen anderen Unterschiede sind, dass, wo es eine „numerische“ in der Funktionsdefinition, die Fehlerzeile verschiedene Typen wie „integer“ zeigt, „double precision“ und "bigint"; und ein Parameter in der Funktionsdefinition ist der Typ "text", wobei der Fehler "character variating" anzeigt.
Ich kann einen ähnlichen Fehler durch Aufruf der Funktion in pgAdminIII erzeugen, außer dass es die String-Werte (zB 'foo' mit Anführungszeichen) sind, die "unbekannt" sind, während die Datumswerte (ich gerade jetzt()) verwendet werden behandelt als "Zeitstempel mit Zeitzone".
Also: mache ich etwas falsch in meinem Hibernate Mapping? Ist es ein Problem mit der Funktion?
Ich habe am Ende alle Felder überschreiben (vielleicht musste ich nur die numerischen Felder überschreiben, aber ich wurde müde von Versuch und Irrtum), und es hat funktioniert. Vielen Dank! –