Как правильно сопоставить дату и время в JPA и Hibernate?

Современные приложения на Java должны использовать типы из java.time API (LocalDate, LocalDateTime, OffsetTime, OffsetDateTime, ZonedDateTime, Duration) вместо устаревших и java.util.Calendar. JPA и Hibernate поддерживают большинство этих типов, сопоставляя их с соответствующими SQL-типами (DATE, TIME, TIMESTAMP, TIMESTAMP_WITH_TIMEZONE). Hibernate предоставляет более широкую поддержку, позволяя, например, работать с ZonedDateTime более гибко.
Как правильно сопоставить дату и время в JPA и Hibernate?
Изображение носит иллюстративный характер

При использовании ZonedDateTime необходимо учитывать версию Hibernate. Hibernate 5 нормализует часовой пояс, что может привести к проблемам при несовпадении часовых поясов JVM и базы данных. Для решения этой проблемы в Hibernate 5 рекомендуется использовать UTC часовой пояс, настроенный в persistence.xml. Hibernate 6 вводит TimeZoneStorageType, позволяя задавать обработку часового пояса и избегать нежелательных нормализаций.

Для маппинга устаревших типов и java.util.Calendar требуется аннотация @Temporal, указывающая соответствие с SQL-типом: DATE, TIME или TIMESTAMP. Типы , java.sql.Time и java.sql.Timestamp автоматически мапятся к SQL-типам с аналогичными именами, без необходимости дополнительных аннотаций.

В целом, рекомендуется использовать типы java.time, поскольку они предлагают более четкое разделение даты и времени, более удобны для работы в бизнес-логике, и их маппинг к SQL-типам прозрачен и логичен. В особенности, при работе с ZonedDateTime следует обращать внимание на настройки часовых поясов и выбирать стратегию сохранения данных, основываясь на версии Hibernate.


Новое на сайте

20065[b]СПКЯ стало СПМЯ: почему переименование болезни, затрагивающей миллионы женщин, заняло... 20064[b]Почему великая пирамида Гизы пережила все землетрясения за 4500 лет[/b] 20063[b]Генетика Homo erectus: что зубная эмаль рассказала о наших предках[/b] 20061[b]Крупнейший плавучий ветрогенератор в мире: Китай испытывает установку у берегов... 20060[b]Карие глаза младенца стали индиго после лечения от COVID-19[/b] 20058[b]Почему серебряная чаша с Афиной пролежала в немецком лесу две тысячи лет?[/b] 20057[b]Дыра в атмосфере солнца: вспышка достигла пика и может зажечь полярное сияние[/b] 20056[b]Динго возрастом 950 лет: кто и зачем кормил могилу животного сотни лет?[/b] 20054[b]Что видели астронавты «Аполлона-12» над лунным горизонтом?[/b] 20053[b]Восковой блокнот на латыни и шёлковая туалетная бумага: кто посещал средневековый... 20051[b]Зелёные камни в пещере Пиренеев: четыре тысячи лет медной металлургии[/b]
Ссылка