Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate-在PostgreSQL中使用java.time.Instant_Java_Postgresql_Hibernate_Jpa - Fatal编程技术网

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
时间戳
Java8
LocalDateTime
表示没有时区信息的日期和时间。相比之下,PostgreSQL
TIMESTAMPTZ
和Java 8
Instant
代表一个绝对时间点,其日历日期和挂钟时间取决于时区。这些是根本不同的概念。如果您知道时区(Hibernate就是这么做的),您可以在它们之间进行转换,但它们不是同一件事。鉴于一个瞬间总是存储在UTC中,使用时间戳而不是时间戳是有意义的。因为如果您更改数据库的时区,时间戳将自动修改。这不是真的。TimestampTZ根据客户端的时区而不是数据库进行更改。