Hibernate ORM 5.3实现了JPA 2.2标准。在接下来的几周里,我们将介绍JPA 2.2引入的各种特性。

JPA 2.2规范说明以下Java 8类型现在受到支持

  • java.time.LocalDate,

  • java.time.LocalTime,

  • java.time.LocalDateTime,

  • java.time.OffsetTime,

  • java.time.OffsetDateTime

在这篇文章中,您将看到Hibernate ORM支持所有这些类型,甚至更多

  • java.time.Duration,

  • java.time.ZonedDateTime

实体映射

假设您有以下实体

@Entity(name = "DateTimeEntity")
public static class DateTimeEntity {

        @Id
        private Integer id;

        @Column(name = "duration_value")
        private Duration duration = Duration.of( 20, ChronoUnit.DAYS );

        @Column(name = "instant_value")
        private Instant instant = Instant.now();

        @Column(name = "local_date")
        private LocalDate localDate = LocalDate.now();

        @Column(name = "local_date_time")
        private LocalDateTime localDateTime = LocalDateTime.now();

        @Column(name = "local_time")
        private LocalTime localTime = LocalTime.now();

        @Column(name = "offset_date_time")
        private OffsetDateTime offsetDateTime = OffsetDateTime.now();

        @Column(name = "offset_time")
        private OffsetTime offsetTime = OffsetTime.now();

        @Column(name = "zoned_date_time")
        private ZonedDateTime zonedDateTime = ZonedDateTime.now();

        //Getters and setters omitted for brevity
}

DateTimeEntity将有一个与之关联的数据库表,如下所示

create table DateTimeEntity
(
    id                  integer not null,
    duration_value      bigint,
    instant_value       timestamp,
    local_date          date,
    local_date_time     timestamp,
    local_time          time,
    offset_date_time    timestamp,
    offset_time         time,
    zoned_date_time     timestamp,
    primary key (id)
)

时间测试

当持久化一个DateTimeEntity

final DateTimeEntity dateTimeEntity = new DateTimeEntity();
dateTimeEntity.setId( 1 );

doInHibernate(this::sessionFactory, session -> {
    session.persist( dateTimeEntity );
} );

Hibernate ORM生成以下SQL语句

insert into DateTimeEntity
(
        duration_value,
        instant_value,
        local_date,
        local_date_time,
        local_time,
        offset_date_time,
        offset_time,
        zoned_date_time,
        id
)
values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)

-- binding parameter [1] as [BIGINT]         - [PT480H]
-- binding parameter [2] as [TIMESTAMP] - [2018-02-20T13:52:31.333Z]
-- binding parameter [3] as [DATE]                 - [2018-02-20]
-- binding parameter [4] as [TIMESTAMP] - [2018-02-20T15:52:31.329]
-- binding parameter [5] as [TIME]                 - [15:52:31.333]
-- binding parameter [6] as [TIMESTAMP] - [2018-02-20T15:52:31.333+02:00]
-- binding parameter [7] as [TIME]                 - [15:52:31.333+02:00]
-- binding parameter [8] as [TIMESTAMP] - [2018-02-20T15:52:31.333+02:00[Europe/Athens]]
-- binding parameter [9] as [INTEGER]         - [1]

当检索实体时

DateTimeEntity _dateTimeEntity = session.find( DateTimeEntity.class, 1 );

Hibernate ORM生成以下SQL语句

select
        dt.id as id1_0_0_,
        dt.duration_value as duration2_0_0_,
        dt.instant_value as instant_3_0_0_,
        dt.local_date as local_da4_0_0_,
        dt.local_date_time as local_da5_0_0_,
        dt.local_time as local_ti6_0_0_,
        dt.offset_date_time as offset_d7_0_0_,
        dt.offset_time as offset_t8_0_0_,
        dt.zoned_date_time as zoned_da9_0_0_
from
        DateTimeEntity dt
where
        dt.id = ?

-- binding parameter [1] as [INTEGER] - [1]

-- extracted value ([duration2_0_0_] : [BIGINT])         - [PT480H]
-- extracted value ([instant_3_0_0_] : [TIMESTAMP]) - [2018-02-20T13:52:31.333Z]
-- extracted value ([local_da4_0_0_] : [DATE])                 - [2018-02-20]
-- extracted value ([local_da5_0_0_] : [TIMESTAMP]) - [2018-02-20T15:52:31.329]
-- extracted value ([local_ti6_0_0_] : [TIME])                 - [15:52:31]
-- extracted value ([offset_d7_0_0_] : [TIMESTAMP]) - [2018-02-20T15:52:31.333+02:00]
-- extracted value ([offset_t8_0_0_] : [TIME])                 - [15:52:31+02:00]
-- extracted value ([zoned_da9_0_0_] : [TIMESTAMP]) - [2018-02-20T15:52:31.333+02:00[Europe/Athens]]

-- duration (Duration)                                 -> 1728000000000000
-- instant (Instant)                                 -> 2018-02-20T13:52:31.333Z
-- localDate (LocalDate)                         -> 2018-02-20
-- localDateTime (LocalDateTime)         -> 2018-02-20 15:52:31.3
-- localTime (LocalTime)                         -> 15:52:31
-- offsetDateTime (OffsetDateTime)         -> 2018-02-20 15:52:31.3 +02:00
-- offsetTime (OffsetTime)                         -> 15:52:31.0 +02:00
-- zonedDateTime (ZonedDateTime)         -> 2018-02-20 15:52:31.3 Europe/Athens

结论

自5.0版本以来,Hibernate ORM通过hibernate-java8模块支持Java 8新类型。

在5.2版本中,这些类型被集成到hibernate-core中,现在Hibernate ORM 5.3支持JPA 2.2,支持JPA标准指定的Java 8日期/时间属性,甚至更多。


返回顶部