CUBA:实体继承

CUBA : entity inheritance

提供的示例 'Entity Inheritance' 具有以下实体模型:
- 客户
- 公司扩展客户
- 人扩展客户
- 订单

OrderEdit 屏幕显示了如何处理与可能是公司或个人的客户关联的字段的继承。这很清楚。

但是,Company 和 Person 的编辑屏幕不考虑继承:它们只是复制通常从 Customer 继承的 'email' 字段。

考虑到我此时的所有输入,如果我必须设计这些屏幕,我会建议采用以下方式。

1) CustomerEditFrame:带有电子邮件字段,未定义数据源

2) PersonEditScreen:
- 人物数据源
- 映射 Person 数据源上的 lastName 和 firstName 字段
- 嵌入 CustomerEditFrame
- 在 CustomerEditFrame 中注入 Person 数据源

3) 公司编辑屏幕:
- 公司数据源
- 将行业字段映射到公司数据源
- 嵌入 CustomerEditFrame
- 在 CustomerEditFrame 中注入公司数据源

然后 CustomerEditFrame 负责编辑它在引用两个子类之一的数据源中知道的字段子集。这个设计行得通吗?

为了文档的完整性,我认为这应该包含在示例中,因为这是常见的情况。此外,这将是一个很好的帧操作示例。

屏幕应考虑实体继承以消除重复代码,您说得完全正确。我已经 fork 示例项目 here 来演示如何使用框架来完成它。

customer-frame.xml 包含基本实体的字段及其数据源:

<window xmlns="http://schemas.haulmont.com/cuba/window.xsd"
        caption="msg://editCaption"
        class="com.company.entityinheritance.gui.customer.CustomerFrame"
        focusComponent="fieldGroup"
        messagesPack="com.company.entityinheritance.gui.customer">
    <dsContext>
        <datasource id="customerDs"
                    class="com.company.entityinheritance.entity.Customer"
                    view="_local"/>
    </dsContext>
    <layout spacing="true">
        <fieldGroup id="fieldGroup"
                    datasource="customerDs">
            <column width="250px">
                <field id="name"/>
                <field id="email"/>
            </column>
        </fieldGroup>
    </layout>
</window>

CustomerFrame 控制器中有一个 public 方法来设置数据源的实例:

public class CustomerFrame extends AbstractFrame {

    @Inject
    private Datasource<Customer> customerDs;

    public void setCustomer(Customer customer) {
        customerDs.setItem(customer);
    }
}

公司编辑器 company-edit.xml 包含框架而不是客户字段:

<window xmlns="http://schemas.haulmont.com/cuba/window.xsd"
        caption="msg://editCaption"
        class="com.company.entityinheritance.gui.company.CompanyEdit"
        datasource="companyDs"
        focusComponent="customerFrame"
        messagesPack="com.company.entityinheritance.gui.company">
    <dsContext>
        <datasource id="companyDs"
                    class="com.company.entityinheritance.entity.Company"
                    view="_local"/>
    </dsContext>
    <layout expand="windowActions"
            spacing="true">
        <frame id="customerFrame"
               screen="demo$Customer.frame"/>
        <fieldGroup id="fieldGroup"
                    datasource="companyDs">
            <column width="250px">
                <field id="industry"/>
            </column>
        </fieldGroup>
        <frame id="windowActions"
               screen="editWindowActions"/>
    </layout>
</window>

在Company editor controller中,注入了框架,并向其传递了一个编辑过的实例:

public class CompanyEdit extends AbstractEditor<Company> {

    @Inject
    private CustomerFrame customerFrame;

    @Override
    protected void postInit() {
        customerFrame.setCustomer(getItem());
    }
}