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

Контейнеры 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());
}