【问题标题】:Persist java.time.Instant (JDK8) with JPA2/Hibernate使用 JPA2/Hibernate 持久化 java.time.Instant (JDK8)
【发布时间】:2014-12-14 08:41:14
【问题描述】:

JPA 和 Hibernate 目前都不支持 JSR-310 在 JDK8 中带来的新日期/时间类(JPA ticket,Hibernate ticket)。尽管如此,我还是想使用 JDK8 日期/时间类进行编码,因为它们最终设计得很好。特别是,我对java.time.Instant 感兴趣,而不是完全支持所有java.time.* 类型,因为我所有的实体都将使用这个特定的类(或者我现在认为,至少:-)

一个选项是编写一个type converter,如 JPA 2.1 所定义。但是,我们的应用服务器是 JBoss EAP 6.3,它与 JPA 2.0 不兼容,但不兼容 2.1,所以现在这是不可能的。

下一个选项是使用 Hibernate 用户类型(关于转换其他 JSR-310 类的博文here)。

还有更好的选择吗?谢谢。

【问题讨论】:

  • 是的:使用为您定义这些休眠用户类型的库:jadira.sourceforge.net/index.html
  • 我建议您接受@PryceJS 的回答,因为它描述了当前的最佳实践。
  • 会的,谢谢。是的,时代变了。

标签: hibernate jpa jpa-2.0 java-8 java-time


【解决方案1】:

查看ThreeTen home page,其中提到了三个不同的 JPA 库:

【讨论】:

    【解决方案2】:

    使用 Hibernate 5.2.0+ 或更早的 Hibernate 5 添加以下依赖项:

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-java8</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
    

    【讨论】:

    • 谢谢。不过,我还不能使用 Hibernate 5,它仅处于测试阶段。
    • Np,你很快就会的。它计划于 2015 年 5 月 27 日发布,请参阅here
    • 遗憾的是,他们改变了发布时间表,目前只有 CR1 版本可用。
    • Hibernate 5 现已稳定,版本 5.0.1
    【解决方案3】:

    从 Hibernate 5.2 开始,这个问题得到了更彻底的解决——您不再需要从 Ipandzic 的评论中包含 hibernate-java8 依赖项,并且您可以使用 java.time.* 类,例如 LocalDateTimeInstant,而无需任何额外步骤。您也不再需要使用 java.util.LocalDateTime 等将列标记为 Temporal,就像使用旧的 java.util.Date 方法一样。

    从 Hibernate 5.2 开始,hibernate-java8 内容已合并到 hibernate-core see the change notes here

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 2010-09-24
      • 2013-11-12
      • 2010-11-24
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多