【发布时间】:2018-10-06 06:47:17
【问题描述】:
我有以下实体类:
@Entity
public class Event {
private OffsetDateTime startDateTime;
// ...
}
但是,使用 JPA 2.2 将实体持久化并从数据库读取实体会导致信息丢失:startDateTime 的 ZoneOffset 更改为 UTC(@987654325 @ 由数据库时间戳使用)。例如:
Event e = new Event();
e.setStartDateTime(OffsetDateTime.parse("2018-01-02T09:00-05:00"));
e.getStartDateTime().getHour(); // 9
e.getStartDateTime().getOffset(); // ZoneOffset.of("-05:00")
// ...
entityManager.persist(e); // Stored startDateTime as timestamp 2018-01-02T14:00Z
Event other = entityManager.find(Event.class, e.getId());
other.getStartDateTime().getHour(); // 14 - DIFFERENT
other.getStartDateTime().getOffset(); // ZoneOffset.of("+00:00") - DIFFERENT
我需要使用OffsetDateTime:我不能使用ZonedDateTime,因为区域规则会发生变化(而且无论如何也会遭受这种信息丢失的影响)。我不能使用LocalDateTime,因为Event 发生在世界任何地方,出于准确性原因,我需要原始ZoneOffset。我不能使用Instant,因为用户填写了一个事件的开始时间(这个事件就像一个约会)。
要求:
需要能够对 JPA-QL 中的时间戳执行
>, <, >=, <=, ==, !=比较需要能够检索与持久化的
OffsetDateTime相同的ZoneOffset
【问题讨论】:
-
我认为这是一个很好的问题,因为文档没有说明很多关于使用 JPA 持久化这些类的内容,并且 EE7 中包含的 JPA 不支持开箱即用地持久化这些类。除此之外,“时间点”和“元信息”的区别可能会令人困惑。这就是为什么我赞成这个问题并指出我的回答中的差异。干杯!
-
@GeoffreyDeSmet 我再次更新了答案,并解释了为什么如果您之前编写过 PDO 代码,添加字段应该不是问题。另外,我添加了规范链接。
-
感谢 Ben - 非常出色的工作 - 但我们有一个硬性要求,即我们的 Event 类(这是一个人类事件,而不是系统事件)有一个字段
OffsetDateTime start和OffsetDateTime end。非简单的 getter 对我们来说不是一个可行的解决方法。例如,jackson 注释也在字段级别。 -
您的
OffsetDateTime最终保存在哪里?什么数据类型的数据库列?
标签: hibernate datetime jpa date jpa-2.2