2016-01-15 46 views
1

我有一個連接到PostgreSQL的Grails 2.5.3應用程序,我想在數據庫中存儲一個java DateCalendar對象,並且包括時區。使用Grails和GORM在PostgreSQL中存儲日期,時間和時區

基礎上PostgreSQL Documentation,默認的時間戳類型不包括時區,所以你需要使用timestamptz類型包括時區。

不幸的是,當我試圖在mapping關閉域類中設置它時,它失敗了。我試圖用這個:

createdDate type: 'timestamptz'

我收到的錯誤是:

nested exception is org.hibernate.MappingException: Could not determine type for: timestamptz

不幸的Hibernate types名單似乎不包括任何可能映射此值。與日期相關的是:date,time,timestamp,calendar,calendar-date。我測試了其中的每一個,並且他們都沒有在Postgres中創建想要的timestamp with time zone

有些文章談論爲此創建自定義Hibernate UserType,但它似乎是一個相當常見的用例,我不禁想到有些東西應該讓我得到這個工作的盒子。

+0

您可能能夠將時間戳和時區存儲爲兩個單獨的屬性/列。 –

回答

2

您可以創建自己的方言,然後將Java類型映射到SQL類型。你可以看到grails-postgresql-extensions插件和子類的方言或只是默認的postgresql。

package my.company 

import java.sql.Types 
import groovy.transform.CompileStatic 
import net.kaleidos.hibernate.PostgresqlExtensionsDialect 

@CompileStatic 
class SQDialect extends PostgresqlExtensionsDialect { 

    SQDialect() { 
     registerColumnType(Types.TIMESTAMP, 'timestamp with time zone') 
    } 
} 
+0

太棒了!非常感謝你的幫助!快速提問。我創建了自己的方言來擴展'PostgreSQL82Dialect',是否有利於擴展'PostgresqlExtensionsDialect'呢? – mnd

+0

使用插件,您可以在Grails應用程序中使用postgresl本機類型,例如數組,hstore,json和jsonb本機類型。你可以在這裏查看文檔:https://github.com/kaleidos/grails-postgresql-extensions 聲明:我是插件的創建者。如果您使用它並遇到一些問題,可隨時提出問題或建議以解決問題。 –