Я обращаюсь к сообществу, потому что либо обнаружил проблему с Hibernate, либо я просто не понимаю, как использовать java.sql.Date
и java.time.LocalDate
.
У меня возникла проблемагде моя БД находится в часовом поясе UTC, а мой клиент - в EST.У меня в БД есть поле с именем ETA
типа DATE
, которое, например, для записи установлено на 2019-09-10
.Когда я читаю дату в EST, она становится 2019-09-09
.Поле DATE
согласно документации не содержит информации о часовом поясе.
Когда Hibernate читает значение, он использует класс DateTypeDescriptor.java
.Однако проблема этого класса заключается в том, что он сначала попытается прочитать значение как java.sql.Date
(в части rs.getDate( name )
) и , а затем , вызов java.sql.Date.toLocalDate()
в части javaTypeDescriptor.wrap()
, которая реализована плохо, потому что она удаляет информацию о смещении часового пояса и просто возвращает дату.Это делает 2019-09-09T20:00:00.000-0400
(то есть 2019-09-10
в базе данных) стать 2019-09-09
без части смещения часового пояса.
Что я считаю проблемой, это та часть, где Hibernate вызывает rs.getDate()
, потому что она должна возвращатьjava.sql.Date
.Теперь драйвер MySQL содержит метод public LocalDate getLocalDate(int columnIndex)
для получения LocalDate
, поэтому я не понимаю, почему Hibernate не использует этот метод.
Я обнаружил, что кто-то уже поднял эту проблему с ними , но они, похоже, не считают это проблемой.
Поэтому я обращаюсь сюда, чтобы понять - есть ли ошибка в Hibernate илия просто не понимаю, как правильно конвертировать между DATE
(DB) и LocalDate
(Java) типами.
PS: я использую последний Hibernate 5.4.5 и последний JPA 2.2.