7.1.2.5. 用单一编辑界面处理一对一组合

在线示例

在一个编辑界面中编辑 One-to-One 组合通常很方便。我们看看以下示例如何实现编辑 CustomerCustomerDetails 一对一关系。

  • customer-edit.xml 描述包含主数据源 customerDs 和嵌套数据源 detailsDs
  1. <dsContext>
  2. <datasource id="customerDs"
  3. class="sample.entity.Customer"
  4. view="customer-view">
  5. <datasource id="detailsDs"
  6. property="details"/>
  7. </datasource>
  8. </dsContext>

两个实体需要编辑的所有字段都被分到同一个 fieldGroup,其中一些字段被绑定到嵌套数据源:

  1. <fieldGroup id="customerGroup"
  2. datasource="customerDs">
  3. <column width="200px">
  4. <field property="name"/>
  5. <field property="email"/>
  6. <field datasource="detailsDs"
  7. property="address"
  8. rows="3"/>
  9. <field datasource="detailsDs"
  10. property="note"
  11. rows="3"/>
  12. </column>
  13. </fieldGroup>
  • CustomerEdit 控制器中重写 initNewItem() 方法,创建一个 CustomerDetails 实例,并将此示例关联到刚创建的 Customer 实例:
  1. @Inject
  2. private Metadata metadata;
  3. @Override
  4. protected void initNewItem(Customer customer) {
  5. customer.setDetails(metadata.create(CustomerDetails.class));
  6. }

最后,处理用户单击 Create 然后想要关闭编辑界面而不修改任何内容的情况。该用户将被要求保存更改,因为 detailsDs 数据源已经包含一个空实例,AbstractEditorisModified() 方法将始终返回 true。为避免出现确认对话框,应该让 isModified() 方法仅关注主数据源中的更改:

  1. @Override
  2. public boolean isModified() {
  3. return customerDs.isModified();
  4. }

现在,可以在一个编辑界面界面中创建和编辑两个关联的实体。