【问题标题】:Storing date, time, and timezone in PostgreSQL with Grails and GORM使用 Grails 和 GORM 在 PostgreSQL 中存储日期、时间和时区
【发布时间】:2016-01-15 21:24:37
【问题描述】:

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

基于PostgreSQL Documentation,默认时间戳类型包含时区,所以需要使用timestamptz类型来包含时区。

不幸的是,当我尝试在域类的 mapping 闭包中进行设置时,它失败了。我正在尝试使用它:

createdDate type: 'timestamptz'

我收到的错误是:

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

不幸的是,Hibernate types 列表似乎不包含任何可以映射此值的内容。与日期相关的有:datetimetimestampcalendarcalendar-date。我已经测试了每一个,它们都没有在 Postgres 中创建所需的timestamp with time zone

有些文章谈论为此创建自定义 Hibernate UserType,但这似乎是一个相当常见的用例,我不禁想到有什么东西可以让我让它工作开箱即用。

【问题讨论】:

  • 您可以将时间戳和时区存储为两个单独的属性/列。

标签: hibernate postgresql grails grails-orm grails-2.0


【解决方案1】:

您可以创建自己的方言,然后将 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 有好处吗?
  • 通过该插件,您可以在 Grails 应用程序中使用 postgresl 原生类型,例如数组、hstore、json 和 jsonb 原生类型。您可以在此处查看文档:github.com/kaleidos/grails-postgresql-extensions 免责声明:我是插件的创建者。如果您使用它并且有一些问题、问题或建议,请随时提出问题。
猜你喜欢
  • 2021-08-29
  • 2016-12-12
  • 2010-10-05
  • 2019-06-15
  • 2014-10-24
  • 1970-01-01
  • 2011-06-06
  • 2021-01-16
  • 2022-08-21
相关资源
最近更新 更多