如何在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 {
    
    @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 {
    
    @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());
    }
}

你可能感兴趣的:(如何在JPA中使用LocalDate和LocalDateTime)