Использовать более новую версию Hibernate или JPA 2.2 для Java 8 Дата / Время в SPRING-BOOT?
Используя 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 Date/Time для переопределения спящей версии или каким-либо образом (если да, то как?) Использовать JPA 2.2 для SPRING_BOOT?
РЕДАКТИРОВАТЬ С Hibernate 5.0.x
Я продолжаю получать:
Вызвано: org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Не удалось выполнить инструкцию SQL-сценария № 1 URL [file:./src/main/resources/db/h2/data-h2.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')), (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: Гексадецимальная строка 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
все работает.
3 ответа
В Hibernate 5.x уже была поддержка Java 8 Date/Time API, но внутри отдельного артефакта, называемого hibernate-java8
,
Используя Maven, вы можете включить его следующим образом:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>5.0.12.Final</version>
</dependency>
Однако, начиная с Hibernate 5.2.x, базовой версией Java для Hibernate является Java 8, поэтому больше не было необходимости хранить отдельный модуль для поддержки даты / времени в Java 8. Вот почему это было теперь объединено в hibernate-core
, как указано в руководстве по миграции:
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
модуль.
Одной из функций, добавленных в Hibernate 5, является поддержка классов Java 8, таких как API даты и времени, поэтому вы можете добавить .jar
на ваш pom.xml
:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>5.1.0.Final</version>
</dependency>
У меня была та же проблема, и игра с spring-boot-parent (наконец, выбрана последняя версия 1.5.x: 1.5.16.RELEASE), и версия spring-boot-starter-data-jpa не помогла.
Что в итоге помогло, так это добавление зависимости от hibernate-java8
, с версией 5.1.X. Как правильно указывает OP, весенняя загрузка по умолчанию уже приносит эту зависимость, но с более низкой (==hibernate.version) версией.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>5.1.0.Final</version><!--$NO-MVN-MAN-VER$-->
</dependency>