При создании колонок класса-сущности для сохранения значений классов-значений можно переопределить параметры колонок, описанные в помеченных аннотацией @Embeddable классах-значениях. Можно изменить имена колонок и их всевозможные ограничения.
Допустим класс Person содержит поле Address address. Класс Address помечен @Embeddable и хранит данные своих полей в соответствующих колонках таблицы PERSON. Но сами настройки полей указаны в классе Address. Так вот эти настройки легко переопределяются в классе Person.
Подготовка
Создадим базовое веб-приложения на связке Spring Boot 3 + Hibernate + PostgreSQL
Убедитесь, что файле /src/main/resources/application.properties есть следующая строка, позволяющая Hibernate’у автоматически создавать (и обновлять) схему БД при запуске приложения на основании аннотаций в классах предметной области:
1 |
spring.jpa.hibernate.ddl-auto=update |
Код
Создадим класс-значение следующего содержания:
1 2 3 4 5 6 7 8 9 10 11 12 |
@Embeddable public class Address { @Column(length = 100) private String city; @Column(length = 100) private String street; private String details; //Конструкторы, геттеры и сеттеры, equals(), hashCode() и т.д. } |
Как видите мы здесь определили размер колонок, создаваемых для хранения значений полей city и street. Кроме того, неявно заданы имена колонок, они будут совпадать с именами полей.
Создадим класс-сущность, который будет включать в себя также данные из Address:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@Entity public class Person { @Id @GeneratedValue private Long id; private String name; @Embedded @AttributeOverride( name = "city", column = @Column(name = "location", length = 200) ) private Address homeAddress; //Конструкторы, геттеры и сеттеры, equals(), hashCode() и т.д. } |
Если мы хотим переопределить настройки колонок класса Address, то мы должны сперва добавить аннотацию @Embedded (для простого «встраивания» никаких аннотаций не нужно). Затем мы добавляем аннотацию @AttributeOverride, где в параметре name указываем имя поля, настройки которого хотим переопределить, а также в параметр column передаём аннотацию @Column со всеми необходимыми параметрами, как если бы мы её размещали прямо над переопределяемым полем.
В данном случае мы для поля city меняем имя колонки на location, а размер VARCHAR колонки на 200 символов (в оригинальных настройках имя так и будет city, а размер — 100 символов).
Над «встраиваемым» полем address можно указать любое необходимое количество аннотаций @AttributeOverride, в которых будут переопределены все нужные поля.
Чтобы проверить результат достаточно просто запустить приложение, а затем в консоли psql посмотреть детали таблицы PERSON:
Как видите поле city было переопределено. Колонка для него называется location и её длина 200 символов.
Мы не переопределяли настройки поля street, поэтому для него так и была создана колонка street. Кроме того, мы указали в настройках длину колонки в 100 символов. Это ограничение также не переопределялось и мы видим его с в схеме БД.