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

时间:2016-01-15 21:24:38

标签: hibernate postgresql grails gorm grails-2.0

我有一个连接到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,但似乎这是一个相当常见的用例,我不能帮助但是认为应该让某些内容我让这个开箱即用。

1 个答案:

答案 0 :(得分: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')
    }
}