2009-06-13 8 views
1

私はjava.util.Dateをタイムゾーンタイプのないpostgresqlタイムスタンプにマップしようとしています。カスタムsql-insertステートメントを使用しています(テーブルが分割されていて、postgresqlが通常の挿入時に更新された行数を返さないため)、関数が存在しないというエラーが表示され続けます。私はこれがこれらの日付フィールドをマッピングする問題が原因だと思う。 Hibernateマッピングから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から返された例外は、単にスタックトレースを有する第2のエラー行を繰り返します)あなたが見るように、何らかの理由で、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"関数定義の1つのパラメータは "text"型で、エラーが "character varying"を示しています。

pgAdminIIIの関数を呼び出すことで同様のエラーが発生することがありますが、日付値(今はnow()を使用しています)は文字列値(例: 'foo'、quotes)は "不明" 「タイムゾーン付きタイムスタンプ」として扱われます。

So:私は休止状態マッピングで何か問題がありますか?それは機能に問題がありますか?

答えて

0

私はその部分にコメントするのに十分な休止状態か分からないが、あなたはおそらくINSERT文でデータ型をオーバーライドすることでエラーを回避できます。

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

おそらくをオーバーライドする必要はありません。すべてフィールドはもちろん、問題の原因となるフィールドだけです。

+0

私はすべてのフィールドをオーバーライドしました(数値フィールドをオーバーライドする必要があっただけかもしれませんが、試行錯誤に疲れました)。ありがとう! –

関連する問題