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
. Это дает возможность редактировать нужные атрибуты пользователя в экране сотрудника, а также приводит к автоматическому сохранению экземпляра пользователя при коммите экрана в одной транзакции с остальными сущностями.