【问题标题】:Use newer hibernate or JPA 2.2 for Java 8 Date/Time in SPRING-BOOT?在 SPRING-BOOT 中为 Java 8 日期/时间使用更新的休眠或 JPA 2.2?
【发布时间】:2018-08-05 17:51:43
【问题描述】:

使用 spring-boot 1.5.10(所以当前)来使用 Java8 日期/时间是不支持,因为默认情况下这个版本的 Spring Boot 使用 Hibernate 5.0.12.Final。 为了实现这一点(Spring Boot 1.5.10),在覆盖版本的pom.xml properties 部分有效。

<hibernate.version>5.2.12.Final</hibernate.version>

问题: 启用 Java8 日期/时间以覆盖休眠版本或以某种方式(如果是,那么如何?)将 JPA 2.2 用于 SPRING_BOOT 的最佳方法是什么?

编辑 随着休眠5.0.x 我不断得到:

原因: org.springframework.jdbc.datasource.init.ScriptStatementFailedException: 执行 URL 的 SQL 脚本语句 #1 失败 [文件:./src/main/resources/db/h2/data-h2.sql]:插入 预订(ID、RESERVATION_NAME、DATE_FROM、DATE_TO)VALUES(1、 'res1', ParseDateTime('01 01 2001', 'd M yyyy'), ParseDateTime('02 01' 2001', 'd M yyyy')), (2, 'res1', ParseDateTime('01 02 2001', 'd M yyyy'), ParseDateTime('02 02 2001', 'd M yyyy')), (3, 'res3', ParseDateTime('01 03 2001', 'd M yyyy'), ParseDateTime('02 03 2001', 'd M yyyy')), (4, 'res4', ParseDateTime('01 04 2001', 'd M yyyy'), ParseDateTime('02 04 2001', 'd M yyyy')), (5, 'res5', ParseDateTime('01 05 2001', 'd M yyyy'), ParseDateTime('02 05 2001', 'd M yyyy'));嵌套异常是 org.h2.jdbc.JdbcSQLException: Heksadecymalny string z nieparzystą liczbą znaków: "2001-01-01 00:00:00.0" 具有奇数个字符的十六进制字符串: “2001-01-01 00:00:00.0”; SQL 语句:INSERT INTO 预订(ID, RESERVATION_NAME, DATE_FROM, DATE_TO) VALUES (1, 'res1', ParseDateTime('01 01 2001', 'd M yyyy'), ParseDateTime('02 01 2001', 'd M yyyy')),

但是当使用5.2.12.Final 时一切正常。

【问题讨论】:

    标签: spring hibernate spring-boot jpa jpa-2.2


    【解决方案1】:

    Hibernate 5.x 已经支持 Java 8 日期/时间 API,但在一个名为 hibernate-java8 的单独工件中。

    使用 Maven,您可以像这样包含它:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-java8</artifactId>
        <version>5.0.12.Final</version>
    </dependency>
    

    但是,从 Hibernate 5.2.x 开始,Hibernate 的基准 Java 版本是 Java 8,因此不再需要为 Java 8 日期/时间支持保留单独的模块。这就是它现在被合并到hibernate-core 中的原因,如migration guide 中所述:

    Hibernate 5.2 是使用 Java 8 JDK 构建的,并且在运行时需要 Java 8 JRE(我们正在调查 Java 9 是否也可以工作)。这有很多含义:

    • hibernate-java8 模块已合并到 hibernate-core 中,现在原生支持 Java 8 日期/时间类型。

    所以,回答您的问题,对于 Hibernate 5.0.x 和 Hibernate 5.1.x,支持新日期/时间 API 的官方方法是使用 hibernate-java8 模块。

    【讨论】:

    • 但是spring-boot 已经有了这个依赖。所以问题不是关于版本,而是提供休眠 5.1.x 功能的最spring-bootish 方式是什么。顺便说一句 Hibernate 5.0.x 不适用于 Java 8 日期/时间。
    • 当我使用5.0.x 时,我不断收到错误,就像我的问题编辑一样。但是,当更改为 5.2.12 时它可以工作
    • @mCs 如果使用 Spring 数据,从特定版本更新的最佳方法是更新整个 Spring 数据 releasetrain。这可以通过配置spring-data-releasetrain.version Maven 属性来完成,例如&lt;spring-data-releasetrain.version&gt;Kay-SR4&lt;/spring-data-releasetrain.version&gt;。这保证您使用与给定 Hibernate 版本兼容的 Spring Data 版本。但是,这也意味着在这种情况下您不能使用最新的最新版本。
    【解决方案2】:

    Hibernate 5 添加的功能之一是支持 Java 8 类,如日期和时间 API,因此您可以将 .jar 添加到您的 pom.xml

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-java8</artifactId>
        <version>5.1.0.Final</version>
    </dependency>
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,并在玩 spring-boot-parent(最终选择使用最新的 1.5.x 版本:1.5.16.RELEASE)和 spring-boot-starter- data-jpa 版本没有帮助。

      最终有什么帮助,是添加了对hibernate-java8 的依赖,并带有 5.1.X 版本。正如 OP 正确指出的那样,默认情况下,spring boot 已经带来了这种依赖关系,但具有较低的 (==hibernate.version) 版本。

      <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-java8</artifactId>
          <version>5.1.0.Final</version><!--$NO-MVN-MAN-VER$-->
      </dependency>
      

      【讨论】:

        猜你喜欢
        • 2017-07-29
        • 1970-01-01
        • 2017-06-13
        • 1970-01-01
        • 2017-08-03
        • 2014-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多