Hibernate中日期类型字段的映射策略

时间:2022-08-07 21:56:20

在Hibernate中映射日期类型的数据是比较麻烦的一件事,因为除了有SQL定义的标准的日期类型,还有各个数据库厂商的自定义类型。这里暂时只考虑三种各个数据库厂商都基本支持的数据类型,如下:

  • Date:该类型对应Java中的java.sql.Date类型;
  • Time:该类型对应Java中的java.sql.Time类型
  • Timestamp:该类型对应Java中的java.sql.Timestamp类型

使用上述的三种类型的字段可以直接映射到数据库中对应的数据类型。但是常见的我们使用较多的是java.util.Date等类型,使用这种类型的字段可以映射成Date/Time/Timestamp中的任何一种类型,当然只靠单独的这种类型是不能完成工作的,但是可以通过一个注解@Temporal 来选择到底映射成数据库中哪种日期/时间类型,具体如下:

  • TemporalType.DATE:对应Date数据类型,格式YYYY-MM-DD;
  • TemporalType.TIME:对应Time数据类型,格式HH:MM:SS;
  • TemporalType.TIMESTAMP:对应Timestamp数据类型,格式YYYY-MM-DD HH:MM:SS,不同的厂商的实现的精度也不同,根据具体情况具体分析;

不仅java.util.Date可以使用上述的注解,对于java.util.Calendar也是可以使用的。

对于Java8中出现的新的日期和时间API,Hibernate也提供了支持,但是首先要先加入Hibernate对Java8的支持包,如下:

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>5.1.0.Final</version>
</dependency>

那么新出现的数据类型和上述的三种基本日期数据类型的映射关系如下:

  • Date
    • java.time.LocalDate
  • Time
    • java.time.LocalTime
    • java.time.OffsetTime
  • Timestamp
    • java.time.Instant
    • java.time.LocalDateTime
    • java.time.OffsetDateTime
    • java.time.ZonedDateTime

注意:在使用Java8中新的日期类型时,与数据库中的日期类型之间的映射是隐式的,不用使用@Temporal注解,并且如果错误的使用了该注解会出现如下的错误:

org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar
property