7.1.3.1. 直接多对多关联

在线示例

这里使用 AirportAirline 实体来实现多对多关联。机场可以服务于多个航空公司,而航空公司也可以为许多机场提供服务:

association recipe 1

  • Airport.java - Airport 实体包含了航空公司列表属性 airlines,并被声明为多对多关系。

在 Studio 实体设计器中,设置 airlines 属性: Attribute type - ASSOCIATION, Cardinality - MANY_TO_MANY

标记 Airport 为关系的拥有方,Studio 会要求在 Airline 实体中创建相应的 airports 属性作为关系的反向对应。

  1. @JoinTable(name = "SAMPLE_AIRLINE_AIRPORT_LINK",
  2. joinColumns = @JoinColumn(name = "AIRPORT_ID"),
  3. inverseJoinColumns = @JoinColumn(name = "AIRLINE_ID"))
  4. @ManyToMany
  5. protected List<Airline> airlines;
  • Airline.java - Airline 实体现在包含多对多的机场列表: Attribute type - ASSOCIATION, Cardinality - MANY_TO_MANY
  1. @JoinTable(name = "SAMPLE_AIRLINE_AIRPORT_LINK",
  2. joinColumns = @JoinColumn(name = "AIRLINE_ID"),
  3. inverseJoinColumns = @JoinColumn(name = "AIRPORT_ID"))
  4. @ManyToMany
  5. protected List<Airport> airports;

默认情况下也会将 Airline 标记为关系的拥有方,这样关系的两边都可以修改集合。

  • views.xml - 机场编辑界面的 airport-airlines 视图包含 airlines 关联属性,这个关联属性使用了 _minimal 视图。airline-airports 视图也包含 airports 机场关联属性。

  • airport-edit.xml - 机场编辑器界面的 XML 描述定义了 Airport 实例的数据源,同时为其航空公司定义了嵌套数据源。它还包含一个显示航空公司的表格以及 addremove 操作。

  • airline-edit.xml - 航空公司编辑界面的 XML 描述定义了 Airline 实例的数据源,同时为机场定义了嵌套数据源。它还包含一个显示机场的表格以及 addremove 操作。

最终,AirportAirport 编辑界面是绝对对称的。

这样,编辑航空公司实例的工作方式如下:

航空公司编辑界面显示机场列表。

用户可以点击 Addhttps://github.com/cuba-platform/sample-model/blob/master/modules/web/src/com/company/sample/web/airports/airport/airport-browse.xml[Airport 查找界面] 将被打开,用户可以选择要添加的机场或打开其编辑界面。在 airport 编辑页面 中点击确定后,更新的机场实例,既保存到数据库又保存到航空公司编辑界面的 airportsDs 数据源 中,因为 Airport 实体是完全独立的。

用户可以创建新机场并删除现有的机场,所有更改将在单独的事务中保存到数据库,并保存到 airportsDs 数据源。

当用户在航空公司编辑界面中点击确定时,更新后的 Airline 实例与新创建的 Airport 实例链接将一起提交给中间层的 DataManager.commit() 方法并保存到数据库。

Aiport 编辑界面中也会以完全相同的方式工作。