Hibernate 使用Grails和GORM在PostgreSQL中存储日期、时间和时区

Hibernate 使用Grails和GORM在PostgreSQL中存储日期、时间和时区,hibernate,postgresql,grails,gorm,grails-2.0,Hibernate,Postgresql,Grails,Gorm,Grails 2.0,我有一个连接到PostgreSQL的Grails 2.5.3应用程序,我想在数据库中存储一个javaDate或Calendar对象,并包含时区 基于,默认时间戳类型不包括时区,因此需要使用timestamptz类型来包括时区 不幸的是,当我试图在域类的映射中设置这个时,它失败了。我试着用这个: createdDate类型:“timestamptz” 我收到的错误是: 嵌套异常为org.hibernate.MappingException:无法确定的类型:timestamptz 不幸的是,列表中似

我有一个连接到PostgreSQL的Grails 2.5.3应用程序,我想在数据库中存储一个java
Date
Calendar
对象,并包含时区

基于,默认时间戳类型不包括时区,因此需要使用
timestamptz
类型来包括时区

不幸的是,当我试图在域类的
映射中设置这个时,它失败了。我试着用这个:

createdDate类型:“timestamptz”

我收到的错误是:

嵌套异常为org.hibernate.MappingException:无法确定的类型:timestamptz

不幸的是,列表中似乎没有包含任何映射此值的内容。与日期相关的是:
日期
时间
时间戳
日历
日历日期
。我已经测试了其中的每一个,没有一个在Postgres中创建所需的带有时区的
时间戳


有一些文章谈到为此创建一个自定义Hibernate
UserType
,但这似乎是一个相当常见的用例,我忍不住认为有一些东西可以让我把这个问题解决掉。

您可以创建自己的方言,然后将Java类型映射到SQL类型。您可以在插件和该方言的子类或默认的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')
    }
}

您可以将时间戳和时区存储为两个单独的属性/列。太棒了!非常感谢你的帮助!快速提问。我创建了自己的方言扩展
postgresql82dialent
,扩展
postgresqlextensionsdialine
有什么好处吗?有了这个插件,您可以在Grails应用程序中使用postgresl本机类型,如数组、hstore、json和jsonb本机类型。你可以在这里查看文档:免责声明:我是插件的创建者。如果您使用它时遇到了一些问题、问题或建议,请随时提出问题。