使用Java 8 LocalDateTime

时间:2017-09-04 11:54:41

标签: mysql jpa java-8 spring-data spring-data-jpa

我过去几个月一直在使用Spring Data JPA和MYSQL,这是一次非常成功和顺畅的体验。在那里我使用java 8 LocalDateTime来存储日期时间字段,JPA自动将这些字段映射到mysql tinyblob列。

最近我要求通过脚本向系统添加一些数据。为了填充日期时间列,我创建了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脚本来生成类似于应用程序的Date time列。 2)我需要将Spring数据JPA映射从tinyblob更改为mysql脚本可以支持的另一种数据类型

感谢您的帮助

谢谢, Keth

修改

按照下面提供的答案和评论后,我能够找到一个简单的解决方案

如果你使用Hibernate 5.0+,你可以放入

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

然后系统开始将java 8 LocalDateTime属性映射到mysql DATETIME列

1 个答案:

答案 0 :(得分:5)

根据JPA 2.1,LocalDateTime并非正式支持(可能在短时间内JPA 2.,2将是官方的)。 Hibernate 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());
}
}