Hibernate 使用Grails和GORM在PostgreSQL中存储日期、时间和时区
我有一个连接到PostgreSQL的Grails 2.5.3应用程序,我想在数据库中存储一个javaHibernate 使用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 不幸的是,列表中似
Date
或Calendar
对象,并包含时区
基于,默认时间戳类型不包括时区,因此需要使用timestamptz
类型来包括时区
不幸的是,当我试图在域类的映射中设置这个时,它失败了。我试着用这个:
createdDate类型:“timestamptz”
我收到的错误是:
嵌套异常为org.hibernate.MappingException:无法确定的类型:timestamptz
不幸的是,列表中似乎没有包含任何映射此值的内容。与日期相关的是:日期
,时间
,时间戳
,日历
,日历日期
。我已经测试了其中的每一个,没有一个在Postgres中创建所需的带有时区的时间戳
有一些文章谈到为此创建一个自定义HibernateUserType
,但这似乎是一个相当常见的用例,我忍不住认为有一些东西可以让我把这个问题解决掉。您可以创建自己的方言,然后将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本机类型。你可以在这里查看文档:免责声明:我是插件的创建者。如果您使用它时遇到了一些问题、问题或建议,请随时提出问题。