API динамических атрибутов
Модель
Динамические атрибуты реализуют модель Entity-Attribute-Value (Сущность-Атрибут-Значение).
-
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, связанном с контейнером данных, содержащим сущность, ассоциированную с динамическим атрибутом. При настройке динамических атрибутов вы можете определить видимость атрибута в рамках экранов и компонентов.