API динамических атрибутов

Модель

Динамические атрибуты реализуют модель Entity-Attribute-Value (Сущность-Атрибут-Значение).

dynattr diagram
  • Category определяет категорию объектов и соответствующий набор динамических атрибутов. Каждая категория должна быть связана с конкретным типом сущности.

    Например, рассмотрим сущность Car (Автомобиль). В этом случае мы можем создать две категории: Truck (Грузовик) и Passenger (Легковой). Категория Truck может включать атрибуты Грузоподъемность и Тип кузова, а категория Passenger - атрибуты Количество мест и Детское кресло.

  • CategoryAttribute представляет динамический атрибут, связанный с конкретной категорией. Каждый атрибут определяет одно поле с определенным типом данных. Обязательное поле code содержит системный идентификатор атрибута, а поле name - понятное пользователю название атрибута.

  • CategoryAttributeValue означает значение динамического атрибута для конкретного экземпляра сущности. Эти значения хранятся в специальной таблице SYS_ATTR_VALUE. Каждая запись в таблице связана с конкретной сущностью через колонку ENTITY_ID.

Экземпляр сущности может обладать динамическими атрибутами из всех категорий, связанных с его типом сущности. Например, если вы создадите две категории для сущности Car, как описано выше, вы можете назначить любой динамический атрибут из обеих категорий экземпляру Car.

Если вы хотите категоризировать экземпляр сущности под одну категорию — например, автомобиль классифицируется как грузовик или легковой — сущность должна реализовывать интерфейс Categorized. Эта настройка гарантирует, что экземпляр сущности связан с конкретной категорией и обладает динамическими атрибутами исключительно из этой категории.

Загрузка и сохранение

Загрузка и сохранение значений динамических атрибутов обрабатывается DataManager. Используйте один из этих методов, чтобы указать, что динамические атрибуты должны быть загружены для экземпляров сущностей:

  • Метод setHint(DynAttrQueryHints.LOAD_DYN_ATTR, true) объекта LoadContext.

  • Метод hint(DynAttrQueryHints.LOAD_DYN_ATTR, true) fluent API.

По умолчанию динамические атрибуты не загружаются. В то же время DataManager всегда сохраняет динамические атрибуты, содержащиеся в экземплярах сущностей, переданных в save().

Значения динамических атрибутов доступны через методы getValue() / setValue() класса EntityValues. Передайте код атрибута с префиксом + в эти методы, например:

@Autowired
private DataManager dataManager;

@ViewComponent
private DataGrid<Car> carsDataGrid;

public void increaseLoadCapacity(Car car, int value) {
    Car carLoad = dataManager.load(Car.class)
            .id(car.getId())
            .hint(DynAttrQueryHints.LOAD_DYN_ATTR, true)
            .one();
    Integer capacity = EntityValues.getValue(car, "+truckLoadCapacity");
    EntityValues.setValue(car, "+truckLoadCapacity", capacity + value);
    dataManager.save(car);
}

На практике прямой доступ к значениям атрибутов в коде приложения редко необходим. Любой динамический атрибут может автоматически отображаться в любом компоненте DataGrid или FormLayout, связанном с контейнером данных, содержащим сущность, ассоциированную с динамическим атрибутом. При настройке динамических атрибутов вы можете определить видимость атрибута в рамках экранов и компонентов.