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
, связанном с контейнером данных, содержащим сущность, ассоциированную с динамическим атрибутом. При настройке динамических атрибутов вы можете определить видимость атрибута в рамках экранов и компонентов.