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



我有一个连接到PostgreSQL的Grails 2.5.3应用程序,我想在数据库中存储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,但这似乎是一个相当常见的用例,我不禁认为有一些东西应该让我开箱即用。

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

最新更新