JPA2.1与Java8 datetime

    xiaoxiao2021-03-26  21

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

    解决办法主要有两类:

    自己定义类型映射支持使用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之间的直接依赖关系。

    转载请注明原文地址: https://ju.6miu.com/read-659627.html

    最新回复(0)