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 问题?

JBoss 5.1:使用 JPA 休眠

Hibernate ORM 5.1 User Guide

我应该为 Spring 3.1.0、Hibernate 4.0.1.Final 和 MySQL 5.1 使用啥池数据源?

MyEclipse的hibernate反转引擎

Hibernate ORM 5.1 User Guide