使用 Grails 和 GORM 在 PostgreSQL 中存储日期、时间和时区
Storing date, time, and timezone in PostgreSQL with Grails and GORM
我有一个连接到 PostgreSQL 的 Grails 2.5.3 应用程序,我想在数据库中存储一个 java Date
或 Calendar
对象,并包括时间区域。
基于PostgreSQL Documentation,默认时间戳类型不包含时区,所以需要使用timestamptz
类型来包含时间区域。
不幸的是,当我尝试在域 class 的 mapping
关闭中设置它时,它失败了。我正在尝试使用这个:
createdDate type: 'timestamptz'
我收到的错误是:
nested exception is org.hibernate.MappingException: Could not determine type for: timestamptz
不幸的是,Hibernate types 的列表似乎没有包含任何可以映射此值的内容。与日期相关的有:date
、time
、timestamp
、calendar
、calendar-date
。我已经测试了其中的每一个,并且 none 其中的 timestamp with time zone
在 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')
}
}
我有一个连接到 PostgreSQL 的 Grails 2.5.3 应用程序,我想在数据库中存储一个 java Date
或 Calendar
对象,并包括时间区域。
基于PostgreSQL Documentation,默认时间戳类型不包含时区,所以需要使用timestamptz
类型来包含时间区域。
不幸的是,当我尝试在域 class 的 mapping
关闭中设置它时,它失败了。我正在尝试使用这个:
createdDate type: 'timestamptz'
我收到的错误是:
nested exception is org.hibernate.MappingException: Could not determine type for: timestamptz
不幸的是,Hibernate types 的列表似乎没有包含任何可以映射此值的内容。与日期相关的有:date
、time
、timestamp
、calendar
、calendar-date
。我已经测试了其中的每一个,并且 none 其中的 timestamp with time zone
在 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')
}
}