1. Обзор
В этом руководстве мы покажем, как использовать @AttributeOverride
для изменения сопоставления столбцов. Мы объясним, как использовать его при расширении или встраивании сущности, а также рассмотрим встраивание одиночных объектов и коллекций.
2. Атрибуты @AttributeOverride
Аннотация содержит два обязательных атрибута:
name –
имя поля включенной сущностистолбец
- определение столбца, которое переопределяет определение, определенное в исходном объекте.
3. Используйте с @MappedSuperclass
Давайте определим класс транспортного средства
:
@MappedSuperclass
public class Vehicle {
@Id
@GeneratedValue
private Integer id;
private String identifier;
private Integer numberOfWheels;
// standard getters and setters
}
Аннотация @MappedSuperclass
указывает , что это базовый класс для других сущностей.
Давайте теперь определим класс Car
, который расширяет Vehicle.
Он демонстрирует, как расширить сущность и сохранить информацию об автомобиле в одной таблице. Обратите внимание, что аннотация идет к классу:
@Entity
@AttributeOverride(name = "identifier", column = @Column(name = "VIN"))
public class Car extends Vehicle {
private String model;
private String name;
// standard getters and setters
}
В результате у нас есть одна таблица со всеми данными автомобиля вместе с данными о транспортном средстве. Дело в том, что для автомобиля мы хотим хранить идентификатор в столбце VIN.
Мы достигаем этого с помощью @AttributeOverride.
Аннотация определяет, что идентификатор
поля хранится в столбце VIN .
4. Использование со встроенным классом
Давайте теперь добавим больше деталей к нашему транспортному средству с двумя встраиваемыми классами.
Давайте сначала определим основную адресную информацию:
@Embeddable
public class Address {
private String name;
private String city;
// standard getters and setters
}
Давайте также создадим класс с информацией о производителе автомобиля:
@Embeddable
public class Brand {
private String name;
private LocalDate foundationDate;
@Embedded
private Address address;
// standard getters and setters
}
Класс Brand
содержит встроенный класс со сведениями об адресе. Мы будем использовать его, чтобы продемонстрировать, как использовать @AttributeOverride
с несколькими уровнями встраивания.
Давайте дополним наш автомобиль
сведениями о марке
:
@Entity
@AttributeOverride(name = "identifier", column = @Column(name = "VIN"))
public class Car extends Vehicle {
// existing fields
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "name", column = @Column(name = "BRAND_NAME", length = 5)),
@AttributeOverride(name = "address.name", column = @Column(name = "ADDRESS_NAME"))
})
private Brand brand;
// standard getters and setters
}
Во-первых, аннотация @AttributeOverrides
позволяет нам изменять более одного атрибута
. Мы переопределили определение столбца имени из класса
Brand
, поскольку такой же столбец существует в классе Car
. В результате название бренда сохраняется в столбце BRAND_NAME
.
Кроме того, мы определили длину столбца, чтобы показать, что можно переопределить не только имя столбца . Обратите внимание, что атрибут столбца
переопределяет все значения переопределенного класса . Чтобы сохранить исходные значения, все должно быть установлено в атрибутах столбца
.
Кроме того, столбец имени из класса
Address
был сопоставлен с ADDRESS_NAME
. Чтобы переопределить сопоставления на нескольких уровнях встраивания, мы используем точку «.» указать путь к переопределенному полю .
5. Встроенная коллекция
Давайте немного поиграем с этой аннотацией и посмотрим, как она работает с коллекцией.
Добавим информацию о владельце автомобиля:
@Embeddable
public class Owner {
private String name;
private String surname;
// standard getters and setters
}
Мы хотим иметь владельца вместе с адресом, поэтому давайте добавим карту владельцев и их адреса :
@Entity
@AttributeOverride(name = "identifier", column = @Column(name = "VIN"))
public class Car extends Vehicle {
// existing fields
@ElementCollection
@AttributeOverrides({
@AttributeOverride(name = "key.name", column = @Column(name = "OWNER_NAME")),
@AttributeOverride(name = "key.surname", column = @Column(name = "OWNER_SURNAME")),
@AttributeOverride(name = "value.name", column = @Column(name = "ADDRESS_NAME")),
})
Map<Owner, Address> owners;
// standard getters and setters
}
Благодаря аннотации мы можем повторно использовать класс Address
. Префикс ключа
указывает на переопределение поля из класса Owner .
Кроме того, префикс значения
указывает на поле из класса Address .
Для списков префикс добавления не требуется.
6. Заключение
На этом мы завершаем эту короткую статью об аннотации @AttibutOverride
. Мы видели, как использовать эту аннотацию при расширении или встраивании объекта. После этого мы научились использовать его с коллекцией.
Как всегда, исходный код примера доступен на GitHub .