7.1.2.3. 一对多:三级嵌套

假设需要添加包含汇合点的一些细节信息的附加实体:Note。现在整个结构如下: Airport > Terminal > Meeting Point > Note

composition recipe 4

CUBA 可以处理最多两层嵌套的组合。这里我们有三个级别,所以我们应该从顶部或底部限制深度。下面我们考虑从组合中移除机场的两种不同方法(从用户体验的角度来看)。此时有个问题,由于移除机场后,航站楼将会独立于机场保存到数据库中,因此无法为尚未保存到数据库的新建机场保存航站楼。两种方法都能解决这个问题:

在线示例

  • 在第一种方法中,机场浏览界面和编辑界面看起来与上面相同,但是编辑界面有额外的 Save 按钮用来保存新机场而不关闭界面。在保存新机场前,用户无法为新机场创建航站楼。
  • airport-edit.xml 包含航站楼的独立数据源,而不是嵌套数据源。该独立数据源链接到机场数据源,这样可以为被编辑的机场加载航站楼。此外,机场编辑界面包含 extendedEditWindowActions 界面子框架,允许用户保存机场而不关闭界面。

  • AirportEdit.java - 这里,在机场编辑界面的 postInit() 方法内,我们控制航站楼的 Create 操作是否启用,然后传递当前机场实例用来初始化新建航站楼的机场属性。

在线示例

  • 在第二种方法中,我们将机场浏览界面拆分为两个面板:一个用于机场列表,另一个用于展示该机场依赖的航站楼列表。航站楼列表现在在机场编辑界面之外。选择机场后,才会启用航站楼的 Create 操作。
  • airport-browse.xml 包含航站楼列表的独立数据源。它链接到机场数据源,这样可以为所选机场加载航站楼。

  • AirportBrowse.java - 在机场浏览界面控制器的 init() 方法中,控制航站楼的 Create 操作是否启用,然后传递当前机场实例用来初始化新建航站楼的机场属性。