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

本文探讨了在Hibernate中如何映射日期类型的数据,包括Date、Time、Timestamp及其与Java 8日期时间API的交互。重点介绍了TemporalType注解在确定数据库中日期/时间类型映射的作用,以及如何处理Java 8新日期时间API与数据库之间的隐式映射问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值