如何在JPA中使用LocalDate和LocalDateTime

java8带来了很多新特性,其中最重要的一个特性就是新的时间和日期API。老的时间日期API存在很多问题,不过在java8中这些特性将不复存在。但是,JPA会把LocalDateLocalDateTime映射成 BLOB类型,而不是 DATETIMESTAMP

为什么JPA不支持LocalDateLocalDateTime

因为JPA2.1版本在java8之前发布,因此@Temporal注解只能用在java.util.Datejava.util.Calendar属性上。

想要在JPA中使用LocalDateLocalDateTime,可以实现Attribute Converter.

The example:

@Entity
public class MyEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;
    
    @Column
    private LocalDate date;
    
    @Column
    private LocalDateTime dateTime;
    
    ...
    
}

转换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());
    }
}

转换LocalDateTime

@Converter(autoApply = true)
public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
    
    @Override
    public Timestamp convertToDatabaseColumn(LocalDateTime locDateTime) {
        return (locDateTime == null ? null : Timestamp.valueOf(locDateTime));
    }

    @Override
    public LocalDateTime convertToEntityAttribute(Timestamp sqlTimestamp) {
        return (sqlTimestamp == null ? null : sqlTimestamp.toLocalDateTime());
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容