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

3
我有一个Grails 2.5.3应用程序,它连接到PostgreSQL数据库,我想在数据库中存储一个java DateCalendar对象,并包括时区信息。
根据PostgreSQL文档,默认的时间戳类型不包含时区信息,因此您需要使用timestamptz类型来包含时区信息。
不幸的是,当我尝试在域类的mapping闭包中设置这个时,它会失败。我尝试使用以下代码: createdDate type: 'timestamptz' 我收到的错误是: nested exception is org.hibernate.MappingException: Could not determine type for: timestamptz 不幸的是,与日期相关的Hibernate类型列表似乎没有包含任何可以映射此值的内容。与日期相关的类型有:datetimetimestampcalendarcalendar-date。我已经测试了每个类型,但没有一个能在Postgres中创建所需的timestamp with time zone
有一些文章讨论了为此创建自定义Hibernate UserType,但似乎这应该是一个相当常见的用例,我不能不想到有什么可以让我直接使用的东西。

您可以将时间戳和时区分别存储为两个属性/列。 - Emmanuel Rosa
1个回答

3
你可以创建自己的方言,然后将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')
    }
}

太棒了!非常感谢您的帮助!我有一个快速问题。我创建了自己的方言,扩展了 PostgreSQL82Dialect,那么扩展 PostgresqlExtensionsDialect 有什么好处吗? - mnd
使用此插件,您可以在Grails应用程序中使用PostgreSQL原生类型,例如数组、hstore、json和jsonb原生类型。您可以在此处查看文档:https://github.com/kaleidos/grails-postgresql-extensions 免责声明:我是该插件的创建者。如果您使用它并遇到问题、有疑问或建议,请随时提出问题。 - Iván López

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接