我的应用程序中的实体有很多即时字段。我不关心时区,所有的都是UTC。我使用的是Postgresql 13. 2。Hibernate 5将CREATE TABLE语句中的那些字段Map到时间戳,Postgresql将其解释为“没有时区的时间戳”。这是所需的行为。
然而,在升级应用程序使用Hibernate 6后,CREATE TABLE语句中的字段现在是“timestamp(6)with time zone”。Liquibase随后生成一个包含大量错误更改的diff。
有没有办法告诉Hibernate 6继续将Instant字段Map到时间戳(不带时区)?
我试着将postgresql服务器的时区设置为“Etc/UTC”,没有帮助。设置也没有帮助spring.jpa.properties.hibernate.jdbc.time_zone=UTC
在应用程序.属性中。
1条答案
按热度按时间6mzjoqzu1#
首先:在Postgres中,用于表示UTC时间戳的 * correct * 数据类型是
timestamp with time zone
,它实际上不存储任何时区信息,它只存储标准化为UTC的时间戳。对于
timestamp with time zone
,内部存储的值始终采用UTC格式(通用协调时间...)。已显式指定时区的输入值将使用该时区的相应偏移量转换为UTC。如果输入字符串中未指定时区,则假定它位于系统的TimeZone
参数指示的时区中。并使用timezone
区域的偏移量转换为UTC。另一方面,SQL类型
timestamp
更像Java中的LocalDateTime
,它本质上不是UTC日期时间。第二:如果您不喜欢Hibernate默认使用的SQL列类型,那么您当然可以更改它,或者使用JPA标准方法:
或者在IMO中更好的原生Hibernate方式:
或:
甚至还有一个由
AvailableSettings.PREFERRED_INSTANT_JDBC_TYPE
定义的(孵化中的)全局设置:但是,我不建议您使用这些设置中的任何一个,因为正如我所说的,在Postgres上使用的正确SQL类型是Hibernate默认使用的类型。