Использование в Hibernate аннотации @ColumnDefault, чтобы задать значение по умолчанию колонок БД.

Аннотация @ColumnDefault надо полем класса предметной области заставит Hibernate создать для этого поля колонку в БД со значением по умолчанию, которое передаёт параметром в эту аннотацию. Кроме того, с помощью параметра GenerationTime.INSERT аннотации @Generated можно определить, возможно ли будет переопределять значение по умолчанию при вставке или оно всегда будет одним и тем же, когда создаётся новая запись в таблице.

Создадим минимальное Spring Boot приложение с поддержкой JPA/Hibernate

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

От данного кода мы ожидаем следующий результат:

Поле age помечено аннотацией @ColumnDefault с параметром value, установленном в «18». А также аннотацией @Generated с параметром value = GenerationTime.INSERT. Мы ожидаем, что при создании схемы БД в таблице PLAYER будет создана колонка age со значением по умолчанию 18. При этом, значение по умолчанию будет устанавливаться только при вставке (не при апдейте) и только если поле age сохраняемого объекта равно null. Если во время вставки в объекте поле age будет заполнено, то значение по умолчанию использовано не будет.

Поле score помечено теми же аннотациями, а также аннотацией @Column с параметром insertable = false. Мы ожидаем, что при вставке значение этого поля в объекте будет проигнорировано, что бы в нём ни было записано. А значит, что новая строка таблицы PLAYER всегда будет содержать «0» в этой колонке.

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

Проверим работу аннотаций в следующем тесте:

Мы создаём два объекта класса Player и делаем вставку в БД. ОБъекту irina мы заполняем только поле name, поля age и score должны будут оказаться заполненными значениями по умолчанию.

Объекту nina мы заполним все поля, в том числе score.

Сразу после вставки в БД мы запрашиваем соответствующие строки и смотрим, как они в итоге сохранились.

В ассертах мы видим, что поле age Ирины заполнилось значением по умолчанию 18, а поле score заполнилось значением 0. Собственно этого мы и ожидали от аннотации @ColumnDefault.

Объекту nina мы задали все поля, в том числе задали поле score равное 10. Однако, из-за аннотации @Column с параметром insertable = false, это значение было проигнорировано при вставке и в БД у Нины в колонке SCORE записан 0.

В схеме это выглядит следующим образом:

Значения по умолчанию задаются внутри самой БД. Использовать или отбрасывать значение поля объекта при вставке — решает Hibernate, ориентируясь на параметр insertable аннотации @Column.