JPA2.1与Java8 date/time

Java 8 开始引入了全新的时间API,但是因为JPA 2.1发布于Java 8之前,所以在JPA2.1中,Java 8 的新时间API是无法默认就被识别,正确地映射到数据库的。

JPA&Hibernate

解决办法主要有两类:

  1. 自己定义类型映射支持
  2. 使用provider提供的扩展

通过AttributeConverter自定义映射支持

以通过AttributeConverter实现java.sql.Date和java.time.LocalDate的转换为例

@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {
        @Override
        public Date convertToDatabaseColumn(LocalDate locDate) {
                return (locDate == null ? null : Date.valueOf(locDate));
        }

        @Override
        public LocalDate convertToEntityAttribute(Date sqlDate) {
                return (sqlDate == null ? null : sqlDate.toLocalDate());
        }
}

有上述Converter后,类型的转换对于实体的使用者来说就是透明的,LocalDate与Date的转换将会自动被应用于所有的attribute。

利用provider自身的扩展

JPA provider自身通常会有自己的扩展方式用于支持Java 8,以 Hibernate为例(5.0及以上),利用Hibernate自身的扩展只是加入一个额外的jar包的问题。

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

这种方式不用写任何额外的代码即可实现对Java 8的支持,但是同时也明确的和JPA provider之间的直接依赖关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值