Перейти к основному содержимому

Переопределение определения столбца с помощью @AttributeOverride

· 4 мин. чтения

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 .