Hibernate-在PostgreSQL中使用java.time.Instant
由于类型不匹配,我得到一个Hibernate-在PostgreSQL中使用java.time.Instant,java,postgresql,hibernate,jpa,Java,Postgresql,Hibernate,Jpa,由于类型不匹配,我得到一个SchemaManagementException。Hibernate版本是5.2.8.Final。hibernate.ddl auto设置为validate org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [end_date] in table [certificate]; found
SchemaManagementException
。Hibernate版本是5.2.8.Final。hibernate.ddl auto
设置为validate
org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [end_date] in table [certificate]; found [date (Types#DATE)], but expecting [timestamp (Types#TIMESTAMP)]
列实体的类型为java.time.Instant
,PostgreSQL列的类型为TIMESTAMPTZ
@Column(name = "end_date")
private Instant endDate;
对于java.time.Instant
,Hibernate类型是InstantType
,它映射到时间戳
JDBC类型。所以我理解了为什么错误会说它需要一个Types#TIMESTAMP
。我不明白的是,错误表明它找到了一个Types\DATE
资料来源:
一种解决方法是将列定义设置为
@Column(name = "end_date", columnDefinition="DATE")
private Instant endDate;
但我并不认为这是一个解决方案。对我来说,一个瞬间是一个时间戳,而不是一个日期,解决方法不是解决办法。对于
java.time.Instant
,PostgreSQL列的类型应为TIMESTAMP
。创建数据库时出错。时间戳
对应的是LocalDateTime
,而不是Instant
。您错了,请看PostgreSQL时间戳
Java8LocalDateTime
表示没有时区信息的日期和时间。相比之下,PostgreSQLTIMESTAMPTZ
和Java 8Instant
代表一个绝对时间点,其日历日期和挂钟时间取决于时区。这些是根本不同的概念。如果您知道时区(Hibernate就是这么做的),您可以在它们之间进行转换,但它们不是同一件事。鉴于一个瞬间总是存储在UTC中,使用时间戳而不是时间戳是有意义的。因为如果您更改数据库的时区,时间戳将自动修改。这不是真的。TimestampTZ根据客户端的时区而不是数据库进行更改。