Использование аннотации @Temporal для уточнения типа колонки, создаваемой Hibernate’ом для полей типа java.util.Date и java.util.Calendar

При автоматическом создании схемы базы данных на основании аннотированных классов предметной области мы можем уточнить тип данных в колонке, которая соответствует полям типа java.util.Date и java.util.Calendar. Поля типа Date хранят информацию о количестве миллисекунд с т.н. начала эпохи. Но такой формат может быть избыточным. Возможно в реальности нас интересует только дата или только время, возможно и то и другое. Соответственно в БД мы хотели бы видеть колонку либо типа DATE, либо типа TIME, либо TIMESTAMP. Аннотация @Temporal позволяет уточнить, какого именно типа создавать колонку для конкретного поля типа Date.

Отметим, что тип java.util.Date (Calendar) является устаревшим. Он хранит время с точностью до миллисекунды (три знака после запятой). Современные типы данных, например, java.time.LocalDateTime хранят время с точностью до микросекунды (шесть знаков после запятой).

Создадим базовое веб-приложения на связке Spring Boot 3 + Hibernate + PostgreSQL

Создадим класс предметной области следующего содержания:

Мы помечаем поля типа Date аннотацией @Temporal, передавая в параметр value различные значения перечисления TemporalType. Смысл этих настроек тривиален:

  • Для поля с TemporalType.DATE мы ожидаем, что будет создана колонка типа DATE.
  • Для поля с TemporalType.TIME мы ожидаем создание колонки типа TIME.
  • Для TemporalType.TIMESTAMP — колонки типа TIMESTAMP.

Запустим приложение, чтобы Hibernate создал для этого класса предметной области таблицу.

Посмотрим описание созданной таблице в psql:

Как видим типы столбцов соответствуют нашим ожиданиям.