Hibernate 5.1 和 Java 8 LocalDateTime
Posted
技术标签:
【中文标题】Hibernate 5.1 和 Java 8 LocalDateTime【英文标题】:Hibernate 5.1 and Java 8 LocalDateTime 【发布时间】:2015-12-19 16:21:39 【问题描述】:我已切换到 Java 8 和 Hibernate 5 以克服无法在 Hibernate 中存储毫秒的问题。
private LocalDateTime date = LocalDateTime.now();
public LocalDateTime getDate()
return date;
Maven 依赖项
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>5.0.1.Final</version>
</dependency>
尽管这个 Hibernate 仍然将 LocalDateTime 对象存储为 tinyblob。我错过了什么?我正在使用 mysql 5.6.19
据此
Hibernate Issue,hibernate-java8 模块应该将它映射到 TIMESTAMP。我尝试在 getter 上放置 @Column(columnDefinition="TIMESTAMP)
,但这导致了 DataIntegrityViolationException。
将@Type(type="org.hibernate.type.LocalDateTimeType")
放在吸气剂上。数据库表仍以 tinyblob 形式存在。
【问题讨论】:
【参考方案1】:截至此评论:
Hibernate 版本为 5.2.10.Final hibernate-java8 已弃用,所有功能都包含在 hibernate-core 中Hibernate 为所有 JDK 日期/时间类型提供类型转换器:
OffsetDateTime
实体上的 getter 应使用 @Type(type= "org.hibernate.type.OffsetDateTimeType")
注释
LocalDateTime
实体上的 getter 应使用 @Type(type= "org.hibernate.type.LocalDateTimeType")
注释
...等等。
【讨论】:
【参考方案2】:Mysql 的时间戳没有毫秒精度,因此无法将其存储为时间戳,可能会检测到这一点并将其保存为 blob。
【讨论】:
【参考方案3】:将其存储为 TINYBLOB 的原因是 JPA 2.1 是在 Java 8 之前发布的,并且当时还不存在日期和时间 API。
要克服这个问题,您需要自己定义到 java.sql.Date 或 java.sql.Timestamp 的映射。
【讨论】:
以上是关于Hibernate 5.1 和 Java 8 LocalDateTime的主要内容,如果未能解决你的问题,请参考以下文章
如何解决 TomEE 8.x、Hibernate 5.4 和 Java 8 的 ASM 问题?
我应该为 Spring 3.1.0、Hibernate 4.0.1.Final 和 MySQL 5.1 使用啥池数据源?