2017-09-04 217 views
1

我一直在使用Spring Data JPA和MYSQL最近幾個月,這是一個非常成功和流暢的體驗。在那裏,我使用java 8 LocalDateTime來存儲日期時間字段,JPA自動將這些字段映射到mysql tinyblob列。Spring Java JPD與Java 8 LocalDateTime

最近我有一個要求通過腳本添加一些數據到系統。爲了填充日期時間列,我創建了MYSQL TIMESTAMP變量並插入到tinyblob列中。但是系統開始抱怨SerializationException,並且根本原因是這個轉換後的datetime列。 然後我看了一下通過應用插入日期時間列如下

select CAST(drop_off_time AS CHAR(10000) CHARACTER SET utf8) From job 

enter image description here

它看起來像當你插入通過應用程序,它插入一些類型的Java序列化。然而,通過一個mysql腳本,我們不能複製該功能。

現在我有兩個選擇。 1)我需要找到一種方法來編寫一個mysql腳本來生成類似於應用程序的日期時間列。 2)我需要從TINYBLOB更改Spring數據JPA映射到哪個MySQL的腳本可以支持

另一種數據類型感謝您的幫助

感謝, Keth

編輯

在遵循下面提供的答案和評論後,我能夠找到一個簡單的解決方案

如果您使用Hibe rnate 5.0+,您可以在

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-java8</artifactId> 
    <version>${hibernate.version}</version> 
</dependency> 

下降然後系統開始在MySQL的DATETIME列

+1

根據其休眠版本的Java 8日期時間API不受支持,並且將以二進制形式存儲,而不是時間戳。 –

+5

LocalDateTime不應存儲在斑點中。這使得無法在日期上進行查詢,無法在Java以外的任何地方使用該值,並且佔用的磁盤空間比所需的多得多。最近的Hibernate版本支持LocalDateTime,它存儲爲日期/時間戳(參見http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#basic-provided)。你使用的是哪個版本的spring/hibernate? –

+3

檢查這個depyendency,它會爲hibernate添加java8 datetime api支持:http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.hibernate%22%20AND%20a%3A%22hibernate- java8%22 據我所知它可用於Hibernate 5只有 –

回答

3

映射了Java 8 LocalDateTime性質鑑別儀表,根據JPA 2.1 LocalDateTime不oficially(可能在很短的時間JPA suppoorted 2.,2將是官方的)。休眠5的支持,「提前釋放」

便攜式和支持,因爲JPA 2.0 javax.persistence.AttributeConverter,工作得非常好所有的JPA提供者(而使得沒有什麼不好的Hibernate的5)

@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()); 
} 
} 
相關問題