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());
}
}
提供的示例 '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());
}
}