Начальные значения можно также задать в контроллере экрана создаваемой сущности в методе 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().addListener(new DsContext.CommitListenerAdapter() { @Override public void beforeCommit(CommitContext context) { context.getCommitInstances().add(userRole); } }); item.setUser(user); }
Здесь в методе initNewItem()
создается новый экземпляр User
, и для него устанавливается некоторая группа доступа defaultGroup
. Связь с ролью defaultRole
устанавливается с помощью нового экземпляра сущности UserRole
. Для сохранения этой связи в БД при коммите экрана, экземпляр UserRole
добавляется в коллекцию сохраняемых сущностей в методе beforeCommit()
слушателя DsContext.CommitListener.
Новый экземпляр User
устанавливается в соответствующем атрибуте редактируемой сущности Employee
, и тем самым оказывается во вложенном источнике данных userDs
. Это дает возможность редактировать нужные атрибуты пользователя в экране сотрудника, а также приводит к автоматическому
сохранению экземпляра пользователя при коммите экрана в одной транзакции с остальными сущностями.