【问题标题】:Hibernate 5.1 and Java 8 LocalDateTimeHibernate 5.1 和 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 形式存在。

【问题讨论】:

    标签: java mysql hibernate maven java-8


    【解决方案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 的映射。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-21
          • 2015-03-01
          • 2019-01-21
          • 2016-02-25
          • 2017-12-19
          • 2017-06-02
          • 2021-08-19
          • 1970-01-01
          相关资源
          最近更新 更多