企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 6.2.4\. 值集合于多对多关联(Collections of values and many-to-many associations) 任何值集合或者多对多关联需要专用的具有一个或多个外键字段的_collection table_、一个或多个_collection element column_,以及还可能有一个或多个索引字段。 对于一个值集合, 我们使用`&lt;element&gt;`标签。 ``` <element column="column_name" formula="any SQL expression" type="typename" length="L" precision="P" scale="S" not-null="true|false" unique="true|false" node="element-name" /> ``` | ![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png) | `column`(可选):保存集合元素值的字段名。 | |:--- |:--- | | ![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png) | `formula` (可选): 用于计算元素的SQL公式 | | ![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png) | `type` (必需):集合元素的类型 | _多对多关联(many-to-many association)_ 使用 `&lt;many-to-many&gt;`元素定义. ``` <many-to-many column="column_name" formula="any SQL expression" class="ClassName" fetch="select|join" unique="true|false" not-found="ignore|exception" entity-name="EntityName" property-ref="propertyNameFromAssociatedClass" node="element-name" embed-xml="true|false" /> ``` | ![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png) | `column`(可选): 这个元素的外键关键字段名 | |:--- |:--- | | ![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png) | `formula` (可选): 用于计算元素外键值的SQL公式. | | ![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png) | `class` (必需): 关联类的名称 | | ![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png) | `outer-join` (可选 - 默认为`auto`): 在Hibernate系统参数中`hibernate.use_outer_join`被打开的情况下,该参数用来允许使用outer join来载入此集合的数据。 | | ![4](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png) | 为此关联打开外连接抓取或者后续select抓取。这是特殊情况;对于一个实体及其指向其他实体的多对多关联进全预先抓取(使用一条单独的`SELECT`),你不仅需要对集合自身打开`join`,也需要对`&lt;many-to-many&gt;`这个内嵌元素打开此属性。 | | ![5](https://box.kancloud.cn/2015-10-12_561bcb95133e7.png) | 对外键字段允许DDL生成的时候生成一个惟一约束。这使关联变成了一个高效的一对多关联。(此句存疑:原文为This makes the association multiplicity effectively one to many.) | | ![6](https://box.kancloud.cn/2016-01-06_568cdb4f32753.png) | `not-found` (可选 - 默认为 `exception`): 指明引用的外键中缺少某些行该如何处理: `ignore` 会把缺失的行作为一个空引用处理。 | | ![7](https://box.kancloud.cn/2016-01-06_568cdb4f41fcc.png) | `entity-name` (可选): 被关联的类的实体名,作为`class`的替代。 | | ![8](https://box.kancloud.cn/2016-01-06_568cdb4f5948a.png) | `property-ref`: (可选) 被关联到此外键(foreign key)的类中的对应属性的名字。若未指定,使用被关联类的主键。 | 例子:首先, 一组字符串: ``` <set name="names" table="NAMES"> <key column="GROUPID"/> <element column="NAME" type="string"/> </set> ``` 包含一组整数的bag(还设置了`order-by`参数指定了迭代的顺序): ``` <bag name="sizes" table="item_sizes" order-by="size asc"> <key column="item_id"/> <element column="size" type="integer"/> </bag> ``` 一个实体数组,在这个案例中是一个多对多的关联(注意这里的实体是自动管理生命周期的对象(lifecycle objects),`cascade="all"`): ``` <array name="addresses" table="PersonAddress" cascade="persist"> <key column="personId"/> <list-index column="sortOrder"/> <many-to-many column="addressId" class="Address"/> </array> ``` 一个map,通过字符串的索引来指明日期: ``` <map name="holidays" table="holidays" schema="dbo" order-by="hol_name asc"> <key column="id"/> <map-key column="hol_name" type="string"/> <element column="hol_date" type="date"/> </map> ``` 一个组件的列表:(下一章讨论) ``` <list name="carComponents" table="CarComponents"> <key column="carId"/> <list-index column="sortOrder"/> <composite-element class="CarComponent"> <property name="price"/> <property name="type"/> <property name="serialNumber" column="serialNum"/> </composite-element> </list> ```