具有Java 8 LocalDateTime的Spring Data JPA

ket*_*eth 3 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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

当您通过应用程序插入时,它看起来像是某种Java序列化插入。但是,通过mysql脚本,我们无法复制该功能。

现在我有两个选择。1)我需要找到一种写mysql脚本来生成类似于应用程序的Date time列的方法。2)我需要将Spring数据JPA映射从tinyblob更改为mysql脚本可以支持的另一种数据类型

感谢你的帮助

谢谢,凯斯

编辑

在遵循以下提供的答案和评论之后,我能够找到一个简单的解决方案

如果您使用的是Hibernate 5.0+,则可以插入

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-java8</artifactId>
    <version>${hibernate.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

Jac*_* Cz 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());
}
}
Run Code Online (Sandbox Code Playgroud)