При автоматическом создании схемы базы данных на основании аннотированных классов предметной области мы можем уточнить тип данных в колонке, которая соответствует полям типа java.util.Date и java.util.Calendar. Поля типа Date хранят информацию о количестве миллисекунд с т.н. начала эпохи. Но такой формат может быть избыточным. Возможно в реальности нас интересует только дата или только время, возможно и то и другое. Соответственно в БД мы хотели бы видеть колонку либо типа DATE, либо типа TIME, либо TIMESTAMP. Аннотация @Temporal позволяет уточнить, какого именно типа создавать колонку для конкретного поля типа Date.
Отметим, что тип java.util.Date (Calendar) является устаревшим. Он хранит время с точностью до миллисекунды (три знака после запятой). Современные типы данных, например, java.time.LocalDateTime хранят время с точностью до микросекунды (шесть знаков после запятой).
Создадим базовое веб-приложения на связке Spring Boot 3 + Hibernate + PostgreSQL
Создадим класс предметной области следующего содержания:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@Entity public class Chrono { @Id Long id; @Temporal(TemporalType.DATE) private Date theDate; @Temporal(TemporalType.TIME) private Date theTime; @Temporal(TemporalType.TIMESTAMP) private Date theTimestamp; //Конструкторы, геттеры и сеттеры, equals(), hashCode() и т.д. } |
Мы помечаем поля типа Date аннотацией @Temporal, передавая в параметр value различные значения перечисления TemporalType. Смысл этих настроек тривиален:
- Для поля с TemporalType.DATE мы ожидаем, что будет создана колонка типа DATE.
- Для поля с TemporalType.TIME мы ожидаем создание колонки типа TIME.
- Для TemporalType.TIMESTAMP — колонки типа TIMESTAMP.
Запустим приложение, чтобы Hibernate создал для этого класса предметной области таблицу.
Посмотрим описание созданной таблице в psql:
Как видим типы столбцов соответствуют нашим ожиданиям.