5.8.3.3. Использование метода initNewItem
Начальные значения можно также задать в контроллере экрана создаваемой сущности в методе initNewItem().
В качестве примера рассмотрим следующую задачу: в проекте имеется сущность Employee (сотрудник компании), которая должна быть связана с платформенной сущностью User (пользователь системы). При создании сотрудника должен создаваться новый экземпляр пользователя.
В 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. Это дает возможность редактировать нужные атрибуты пользователя в экране сотрудника, а также приводит к автоматическому сохранению экземпляра пользователя при коммите экрана в одной транзакции с остальными сущностями.