JPA(Hibernate)使用LocalDate LocalDateTime出現時間保持結果異常解決

做單元測試的時候發現新增數據的時間不對,由於使用的jpa保存的數據,實體類的時間爲LocalDateTime, 數據庫字段爲DateTime

實體的時間爲:15:50,可是存到數據庫後就變成了1:50,很是詫異
在這裏插入圖片描述
在這裏插入圖片描述

接下來就想辦法怎麼解決吧。。。。
一共想到倆種方式,要麼是mysql的時區有問題,要麼jpa有問題

一 jpa的問題

由於低版本JPA(2.3之前)中還未使用jdk1.8的新特性,會把LocalDate和LocalDateTime映射成 BLOB類型,而不是 DATE或 TIMESTAMP。

大家知道,在實體Entity裏面,可以使用java.sql.Date、java.sql.Timestamp、java.util.Date來映射到數據庫的date、timestamp、datetime等字段
但是,java.sql.Date、java.sql.Timestamp、java.util.Date這些類都不好用,很多方法都過時了。

Java8裏面新出來了一些API,LocalDate、LocalTime、LocalDateTime 非常好用

爲什麼JPA不支持LocalDate 和LocalDateTime?
因爲JPA2.1版本在java8之前發佈,因此@Temporal註解只能用在java.util.Date和java.util.Calendar屬性上。

看到jpa解析出來的類型是時間戳,那就放心了不是jpa的版本引起的
在這裏插入圖片描述
那要是版本引起的除了升級還有啥法子可以解決呢?

使用AttributeConverter自定義參數解析

//轉換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());
    }
}

然後在對應的實體類需要轉換的字段上加上註解既可

    @Column
    @Convert(converter = LocalDateTimeAttributeConverter.class)
    private LocalDateTime endTime;

二 查看&修改mysql時區

查看 設置mysql時區

查看時區

show variables like ‘%time_zone%’;

system_time_zone CST
time_zone SYSTEM

設置全局

set global time_zone=’+8:00’;

設置當前會話

set time_zone=’+8:00’;

立即生效

flush privileges;

查看操作系統時區

UTC是協調世界時(Universal Time Coordinated)

GMT(Greenwich Mean Time)是格林尼治平時

而CST卻同時可以代表如下 4 個不同的時區:

美國中部時間:Central Standard Time (USA) UT-6:00
澳大利亞中部時間:Central Standard Time (Australia) UT+9:30
中國標準時間:China Standard Time UT+8:00
古巴標準時間:Cuba Standard Time UT-4:00

感謝以下幾位大佬的分享
參考:
https://blog.csdn.net/mn960mn/article/details/53141366
https://blog.csdn.net/lmy86263/article/details/52650721?locationNum=11
https://www.cnblogs.com/blog-ice/p/10243963.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章