过去几个月我一直在使用 Spring Data JPA 和 MYSQL,这是一次非常成功和顺利的经历。在那里,我使用 java 8 LocalDateTime 来存储日期时间字段,JPA 自动将这些字段映射到 mysql tinyblob 列。
最近我收到一个要求,通过脚本向系统添加一些数据。为了填充日期时间列,我创建了 MYSQL TIMESTAMP 变量并插入到tinyblob 列中。然而系统开始抱怨 SerializationException ,其根本原因是转换后的日期时间列。
然后我查看了通过应用程序插入的日期时间列,如下所示
select CAST(drop_off_time AS CHAR(10000) CHARACTER SET utf8) From job
看起来当您通过应用程序插入时,它会作为某种 java 序列化插入。然而,通过 mysql 脚本我们无法复制该功能。
现在我有两个选择。
1)我需要找到一种方法来编写mysql脚本来生成类似于应用程序的日期时间列。
2)我需要将Spring数据JPA映射从tinyblob更改为mysql脚本可以支持的另一种数据类型
感谢你的帮助
谢谢,
凯斯
EDIT
在遵循下面提供的答案和评论后,我找到了一个简单的解决方案
如果你使用 Hibernate 5.0+,你可以加入
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>${hibernate.version}</version>
</dependency>
然后系统开始将 java 8 LocalDateTime 属性映射到 mysql DATETIME 列
根据 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());
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)