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

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

  • customer-edit.xml 描述包含主数据源 customerDs 和嵌套数据源 detailsDs

    <dsContext>
        <datasource id="customerDs"
                    class="sample.entity.Customer"
                    view="customer-view">
            <datasource id="detailsDs"
                        property="details"/>
        </datasource>
    </dsContext>

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

    <fieldGroup id="customerGroup"
                datasource="customerDs">
        <column width="200px">
            <field property="name"/>
            <field property="email"/>
            <field datasource="detailsDs"
                   property="address"
                   rows="3"/>
            <field datasource="detailsDs"
                   property="note"
                   rows="3"/>
        </column>
    </fieldGroup>
  • CustomerEdit 控制器中重写 initNewItem() 方法,创建一个 CustomerDetails 实例,并将此示例关联到刚创建的 Customer 实例:

    @Inject
    private Metadata metadata;
    
    @Override
    protected void initNewItem(Customer customer) {
        customer.setDetails(metadata.create(CustomerDetails.class));
    }

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

    @Override
    public boolean isModified() {
        return customerDs.isModified();
    }

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