Переопределение параметров полей встраиваемых @Embeddable классов с помощью аннотаций @Embedded и @AttributeOverride в Hibernate

При создании колонок класса-сущности для сохранения значений классов-значений можно переопределить параметры колонок, описанные в помеченных аннотацией @Embeddable классах-значениях. Можно изменить имена колонок и их всевозможные ограничения.

Допустим класс Person содержит поле Address address. Класс Address помечен @Embeddable и хранит данные своих полей в соответствующих колонках таблицы PERSON. Но сами настройки полей указаны в классе Address. Так вот эти настройки легко переопределяются в классе Person.

Подготовка

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

Убедитесь, что файле /src/main/resources/application.properties есть следующая строка, позволяющая Hibernate’у автоматически создавать (и обновлять) схему БД при запуске приложения на основании аннотаций в классах предметной области:

Код

Создадим класс-значение следующего содержания:

Как видите мы здесь определили размер колонок, создаваемых для хранения значений полей city и street. Кроме того, неявно заданы имена колонок, они будут совпадать с именами полей.

Создадим класс-сущность, который будет включать в себя также данные из Address:

Если мы хотим переопределить настройки колонок класса Address, то мы должны сперва добавить аннотацию @Embedded (для простого «встраивания» никаких аннотаций не нужно). Затем мы добавляем аннотацию @AttributeOverride, где в параметре name указываем имя поля, настройки которого хотим переопределить, а также в параметр column передаём аннотацию @Column со всеми необходимыми параметрами, как если бы мы её размещали прямо над переопределяемым полем.

В данном случае мы для поля city меняем имя колонки на location, а размер VARCHAR колонки на 200 символов (в оригинальных настройках имя так и будет city, а размер — 100 символов).

Над «встраиваемым» полем address можно указать любое необходимое количество аннотаций @AttributeOverride, в которых будут переопределены все нужные поля.

Чтобы проверить результат достаточно просто запустить приложение, а затем в консоли psql посмотреть детали таблицы PERSON:

Как видите поле city было переопределено. Колонка для него называется location и её длина 200 символов.

Мы не переопределяли настройки поля street, поэтому для него так и была создана колонка street. Кроме того, мы указали в настройках длину колонки в 100 символов. Это ограничение также не переопределялось и мы видим его с в схеме БД.