【发布时间】:2018-08-24 19:58:15
【问题描述】:
我认为java.time.Instant 是将日期存储到数据库中的最佳选择:它最有可能是TIMESTAMP,并且您不依赖于时区,它只是时间上的一个时刻。
JPA 支持LocalDate、LocalTime、LocalDateTime 等,但不支持 Instant。当然,您可以使用 AttributeConverter 或像 Jadira 这样的一些库,但为什么不支持开箱即用?
【问题讨论】:
-
请注意,Hibernate 5 支持它。
-
我知道。但是今天在与我的同事讨论时出现了一个想法,即您不应该使用 Instant,因为 JPA 不支持它。我想知道为什么?
-
DataNucleus JPA 在 Java 8 之前就已经支持它!一个简单的事实是,Oracle 对 JPA API 很懒惰,并且懒得向它提交资源,因此 JPA 2.2 中的项目很少,这是他们遗漏的类型
-
RE:您的第一句话:(a) 是的,使用
java.time.Instant来表示一个时刻,例如SQL 标准的TIMESTAMP WITH TIME ZONE列。是的,Instant替换了java.util.Date和java.sql.Timestamp类。 (b) 不,“不取决于时区”是不正确的。在Instant: UTC 上有一个时区。至于数据库,这种行为会有所不同。例如,在 Postgres 中,TIMESTAMP WITH TIME ZONE列的输入使用任何提供的区域/偏移信息来调整为 UTC 进行存储,然后在调整完成后丢弃提供的区域/偏移信息。 -
忽略在本页和其他地方看到的关于使用
java.time.LocalDateTime的错误建议。该类确实不代表一个时刻,因为它故意缺少任何区域/偏移的概念。该类别是不确定的,代表了一个关于在大约 26-27 小时(全球时区范围)范围内潜在时刻的粗略概念。
标签: java jpa java.time.instant