从 2.2 版开始,JPA 支持映射 Java 8 日期/时间 API,例如 LocalDateTime、LocalTime、LocalDateTimeTime、OffsetDateTime 或 OffsetTime。
此外,即使使用 JPA 2.1,Hibernate 5.2 默认也支持所有 Java 8 日期/时间 API。
在 Hibernate 5.1 和 5.0 中,您必须添加 hibernate-java8 Maven 依赖项。
所以,假设我们有以下Notification 实体:
@Entity(name = "Notification")
@Table(name = "notification")
public class Notification {
@Id
private Long id;
@Column(name = "created_on")
private OffsetDateTime createdOn;
@Column(name = "notify_on")
private OffsetTime clockAlarm;
//Getters and setters omitted for brevity
}
注意createdOn 属性是OffsetDateTime Java 对象,clockAlarm 是OffsetTime 类型。
持久化Notification时:
ZoneOffset zoneOffset = ZoneOffset.systemDefault().getRules()
.getOffset(LocalDateTime.now());
Notification notification = new Notification()
.setId(1L)
.setCreatedOn(
LocalDateTime.of(
2020, 5, 1,
12, 30, 0
).atOffset(zoneOffset)
).setClockAlarm(
OffsetTime.of(7, 30, 0, 0, zoneOffset)
);
entityManager.persist(notification);
Hibernate 生成正确的 SQL INSERT 语句:
INSERT INTO notification (
notify_on,
created_on,
id
)
VALUES (
'07:30:00',
'2020-05-01 12:30:00.0',
1
)
在获取Notification 实体时,我们可以看到OffsetDateTime 和OffsetTime
从数据库中正确获取:
Notification notification = entityManager.find(
Notification.class, 1L
);
assertEquals(
LocalDateTime.of(
2020, 5, 1,
12, 30, 0
).atOffset(zoneOffset),
notification.getCreatedOn()
);
assertEquals(
OffsetTime.of(7, 30, 0, 0, zoneOffset),
notification.getClockAlarm()
);