3.5.3.1.3. Контейнеры свойств
Контейнеры InstancePropertyContainer
и CollectionPropertyContainer
предназначены для работы с единичными экземплярами и коллекциями экземпляров сущностей, которые являются атрибутами других сущностей. К примеру, если у сущности Order
имеется атрибут orderLines
, который представляет собой коллекцию экземпляров сущности OrderLine
, для привязывания атрибута orderLines
к таблице можно использовать контейнер CollectionPropertyContainer
.
Контейнеры свойств (property containers) реализуют интерфейс Nested
, в котором определены методы получения родительского контейнера и имя его дочернего атрибута, чтобы привязать к нему контейнер свойства. В примере с сущностями Order
и OrderLine
родительским контейнером будет тот, в котором хранится экземпляр Order
.
InstancePropertyContainer
работает напрямую с атрибутом родительской сущности. Это значит, что при вызове метода setItem()
значение будет установлено для атрибута соответствующей родительской сущности, и будет вызван слушатель её события ItemPropertyChangeEvent
.
CollectionPropertyContainer
содержит копию родительской коллекции. Ниже описаны его методы:
-
getMutableItems()
возвращает изменяемый список сущностей, и изменения списка отражаются на базовом свойстве. То есть, если вы удалите элемент из этого списка, базовый атрибут будет изменён, а для родительского контейнера будет вызван слушательItemPropertyChangeEvent
. -
getDisconnectedItems()
возвращает изменяемый список сущностей, но изменения списка не отражаются на базовом свойстве. То есть, если вы удалите элемент из этого списка, базовый атрибут останется неизменным. -
setItems()
устанавливает коллекцию экземпляров сущностей для контейнера и его базового свойства. СлушательItemPropertyChangeEvent
вызывается для родительского контейнера. -
setDisconnectedItems()
устанавливает коллекцию экземпляров сущностей для контейнера, но базовый исходный атрибут останется неизменным.
Методы getDisconnectedItems()
и setDisconnectedItems()
можно использовать для временного изменения отображения коллекции в UI, например, для фильтрации таблицы:
@Inject
private CollectionPropertyContainer<OrderLine> orderLinesDc;
private void filterByProduct(String product) {
List<OrderLine> filtered = getEditedEntity().getOrderLines().stream()
.filter(orderLine -> orderLine.getProduct().equals(product))
.collect(Collectors.toList());
orderLinesDc.setDisconnectedItems(filtered);
}
private void resetFilter() {
orderLinesDc.setDisconnectedItems(getEditedEntity().getOrderLines());
}