Контейнеры свойств
Контейнеры InstancePropertyContainer
и CollectionPropertyContainer
предназначены для работы с единичными экземплярами и коллекциями экземпляров сущностей, которые являются атрибутами других сущностей.
Контейнеры свойств можно определить в XML-дескрипторе следующим образом:
<data>
<instance id="departmentDc"
class="ui.ex1.entity.Department"> (1)
<fetchPlan extends="_base">
<property name="employees" fetchPlan="_base"/>
</fetchPlan>
<loader/>
<collection id="employeesDc" property="employees"/> (2)
</instance>
</data>
1 | InstanceContainer содержит экземпляр сущности Department , имеющей атрибут employee . |
2 | CollectionPropertyContainer содержит коллекцию экземпляров сущности Employee , являющейся атрибутом сущности Department . |
Также контейнер свойств можно создать программно:
@Autowired
private DataComponents dataComponents;
private InstanceContainer<Department> departmentDc;
private CollectionPropertyContainer<Employee> employeesDc;
private void createPropertyContainer() {
employeesDc = dataComponents.createCollectionContainer(
Employee.class, departmentDc, "employee");
}
Методы
Контейнеры свойств (property containers) реализуют интерфейс Nested
, в котором определены методы получения родительского контейнера и имя его дочернего атрибута, чтобы привязать к нему контейнер свойства. В примере с сущностями Department
и Employee
родительским контейнером будет тот, в котором хранится экземпляр Department
.
InstancePropertyContainer
работает напрямую с атрибутом родительской сущности. Это значит, что при вызове метода setItem()
значение будет установлено для атрибута соответствующей родительской сущности, и будет вызван слушатель ее события ItemPropertyChangeEvent
.
CollectionPropertyContainer
содержит копию родительской коллекции. Ниже описаны его методы:
-
getMutableItems()
возвращает изменяемый список сущностей, и изменения списка отражаются на базовом свойстве. То есть, если вы удалите элемент из этого списка, базовый атрибут будет изменен, а для родительского контейнера будет вызван слушательItemPropertyChangeEvent
. -
getDisconnectedItems()
возвращает изменяемый список сущностей, но изменения списка не отражаются на базовом свойстве. То есть, если вы удалите элемент из этого списка, базовый атрибут останется неизменным. -
setItems()
устанавливает коллекцию экземпляров сущностей для контейнера и его базового свойства. СлушательItemPropertyChangeEvent
вызывается для родительского контейнера. -
setDisconnectedItems()
устанавливает коллекцию экземпляров сущностей для контейнера, но базовый исходный атрибут останется неизменным.
Методы getDisconnectedItems()
и setDisconnectedItems()
можно использовать для временного изменения отображения коллекции в UI, например, для фильтрации таблицы:
@Autowired
private CollectionPropertyContainer<Employee> employeesDc;
private void filterByPosition(Position position) {
List<Employee> filtered = getEditedEntity().getEmployees().stream()
.filter(employee -> employee.getPosition().equals(position))
.collect(Collectors.toList());
employeesDc.setDisconnectedItems(filtered);
}
private void resetFilter() {
employeesDc.setDisconnectedItems(getEditedEntity().getEmployees());
}