5.8.2.3. Использование метода initNewItem

Начальные значения можно также задать в контроллере экрана создаваемой сущности в методе initNewItem().

В качестве примера рассмотрим следующую задачу: в проекте имеется сущность Employee (сотрудник компании), которая должна быть связана один-к-одному с платформенной сущностью User (пользователь системы). При создании сотрудника должен создаваться новый экземпляр пользователя.

init values recipe 2

В XML-дескрипторе экрана редактирования сотрудника объявляем источник данных для экземпляра сотрудника и вложенный источник - для связанного пользователя:

<dsContext>
    <datasource id="employeeDs"
                class="com.haulmont.sample.entity.Employee"
                view="employee-edit">
        <datasource id="userDs"
                    property="user"/>
    </datasource>
</dsContext>

В контроллере экрана редактирования сотрудника определяем:

@Inject
private Metadata metadata;

private Group defaultGroup;
private Role defaultRole;

@Override
protected void initNewItem(Employee item) {
    User user = metadata.create(User.class);
    user.setGroup(defaultGroup);
    final UserRole userRole = metadata.create(UserRole.class);
    userRole.setUser(user);
    userRole.setRole(defaultRole);
    getDsContext().addBeforeCommitListener(context -> {
        context.getCommitInstances().add(userRole);
    });
    item.setUser(user);
}

Здесь в методе initNewItem() создается новый экземпляр User, и для него устанавливается некоторая группа доступа defaultGroup. Связь с ролью defaultRole устанавливается с помощью нового экземпляра сущности UserRole. Для сохранения этой связи в БД при коммите экрана, экземпляр UserRole добавляется в коллекцию сохраняемых сущностей в методе beforeCommit() слушателя DsContext.CommitListener.

Новый экземпляр User устанавливается в соответствующем атрибуте редактируемой сущности Employee, и тем самым оказывается во вложенном источнике данных userDs. Это дает возможность редактировать нужные атрибуты пользователя в экране сотрудника, а также приводит к автоматическому сохранению экземпляра пользователя при коммите экрана в одной транзакции с остальными сущностями.