Контейнеры свойств

Контейнеры InstancePropertyContainer и CollectionPropertyContainer предназначены для работы с единичными экземплярами и коллекциями экземпляров сущностей, которые являются атрибутами других сущностей.

Контейнеры свойств можно определить в XML-дескрипторе следующим образом:

<data>
    <instance id="departmentDc"
              class="ui.ex1.entity.Department"> (1)
        <fetchPlan extends="_base">
            <property name="employee" fetchPlan="_base"/>
        </fetchPlan>
        <loader/>
        <collection id="employeesDc" property="employee"/> (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().getEmployee().stream()
            .filter(employee -> employee.getPosition().equals(position))
            .collect(Collectors.toList());
    employeesDc.setDisconnectedItems(filtered);
}

private void resetFilter() {
    employeesDc.setDisconnectedItems(getEditedEntity().getEmployee());
}