Контейнеры свойств
Контейнеры InstancePropertyContainer и CollectionPropertyContainer предназначены для работы с единичными экземплярами и коллекциями экземпляров сущностей, которые являются атрибутами других сущностей.
Контейнеры свойств можно определить в XML-дескрипторе следующим образом:
<instance id="userDc"
          class="com.company.onboarding.entity.User"> (1)
    <fetchPlan extends="_base">
        <property name="department" fetchPlan="_base"/>
        <property name="steps" fetchPlan="_base">
            <property name="step" fetchPlan="_base"/>
        </property>
        <property name="hobbies" fetchPlan="_base"/>
    </fetchPlan>
    <loader/>
    <collection id="stepsDc" property="steps"/> (2)
</instance>| 1 | InstanceContainerсодержит экземпляр сущностиUser, имеющей атрибутsteps. | 
| 2 | CollectionPropertyContainerсодержит коллекцию экземпляров сущностиUserStep, находящуюся в атрибутеstepsсущностиUser. | 
Методы
Контейнеры свойств (property containers) реализуют интерфейс Nested, в котором определены методы получения контейнера-владельца и имени его атрибута, к которому привязан контейнер свойства. В примере с сущностями User и UserStep контейнером-владельцем будет тот, в котором хранится экземпляр User.
InstancePropertyContainer работает напрямую с атрибутом сущности-владельца. Это значит, что при вызове метода setItem() значение будет установлено для атрибута соответствующей сущности-владельца, и будет вызван слушатель ее события ItemPropertyChangeEvent.
CollectionPropertyContainer содержит копию коллекции сущности-владельца. Ниже описаны методы CollectionPropertyContainer:
- 
getMutableItems()возвращает изменяемый список сущностей, и изменения списка отражаются на связанном свойстве. То есть, если вы удалите элемент из этого списка, атрибут сущности-владельца будет изменен, а для контейнера-владельца будет вызван слушательItemPropertyChangeEvent.
- 
getDisconnectedItems()возвращает изменяемый список сущностей, но изменения списка не отражаются на связанном свойстве. То есть, если вы удалите элемент из этого списка, атрибут сущности-владельца изменен не будет.
- 
setItems()устанавливает коллекцию экземпляров сущностей для контейнера и связанного с ним свойства сущности-владельца. Для контейнера-владельца вызывается слушательItemPropertyChangeEvent.
- 
setDisconnectedItems()устанавливает коллекцию экземпляров сущностей для контейнера, но связанное свойство сущности-владельца не изменяется.
Методы getDisconnectedItems() и setDisconnectedItems() можно использовать для временного изменения отображения коллекции в UI, например, для фильтрации таблицы:
@ViewComponent
private CollectionPropertyContainer<UserStep> stepsDc;
@Autowired
private MetadataTools metadataTools;
private void filterByDueDate(LocalDate dueDate) {
    List<UserStep> filtered = getEditedEntity().getSteps().stream()
            .filter(userStep -> userStep.getDueDate().isAfter(dueDate))
            .collect(Collectors.toList());
    stepsDc.setDisconnectedItems(filtered);
}
private void resetFilter() {
    stepsDc.setDisconnectedItems(getEditedEntity().getSteps());
}