6.2.4. 值集合于多对多关联(Collections of values and many-to-many associations)

任何值集合或者多对多关联需要专用的具有一个或多个外键字段的collection table、一个或多个collection element column,以及还可能有一个或多个索引字段。

对于一个值集合, 我们使用<element>标签。

  1. <element
  2. column="column_name"
  3. formula="any SQL expression"
  4. type="typename"
  5. length="L"
  6. precision="P"
  7. scale="S"
  8. not-null="true|false"
  9. unique="true|false"
  10. node="element-name"
  11. />
1column(可选):保存集合元素值的字段名。
2formula (可选): 用于计算元素的SQL公式
3type (必需):集合元素的类型

多对多关联(many-to-many association) 使用 &lt;many-to-many&gt;元素定义.

  1. <many-to-many
  2. column="column_name"
  3. formula="any SQL expression"
  4. class="ClassName"
  5. fetch="select|join"
  6. unique="true|false"
  7. not-found="ignore|exception"
  8. entity-name="EntityName"
  9. property-ref="propertyNameFromAssociatedClass"
  10. node="element-name"
  11. embed-xml="true|false"
  12. />
1column(可选): 这个元素的外键关键字段名
2formula (可选): 用于计算元素外键值的SQL公式.
3class (必需): 关联类的名称
3outer-join (可选 - 默认为auto): 在Hibernate系统参数中hibernate.use_outer_join被打开的情况下,该参数用来允许使用outer join来载入此集合的数据。
4为此关联打开外连接抓取或者后续select抓取。这是特殊情况;对于一个实体及其指向其他实体的多对多关联进全预先抓取(使用一条单独的SELECT),你不仅需要对集合自身打开join,也需要对&lt;many-to-many&gt;这个内嵌元素打开此属性。
5对外键字段允许DDL生成的时候生成一个惟一约束。这使关联变成了一个高效的一对多关联。(此句存疑:原文为This makes the association multiplicity effectively one to many.)
6not-found (可选 - 默认为 exception): 指明引用的外键中缺少某些行该如何处理: ignore 会把缺失的行作为一个空引用处理。
7entity-name (可选): 被关联的类的实体名,作为class的替代。
8property-ref: (可选) 被关联到此外键(foreign key)的类中的对应属性的名字。若未指定,使用被关联类的主键。

例子:首先, 一组字符串:

  1. <set name="names" table="NAMES">
  2. <key column="GROUPID"/>
  3. <element column="NAME" type="string"/>
  4. </set>

包含一组整数的bag(还设置了order-by参数指定了迭代的顺序):

  1. <bag name="sizes"
  2. table="item_sizes"
  3. order-by="size asc">
  4. <key column="item_id"/>
  5. <element column="size" type="integer"/>
  6. </bag>

一个实体数组,在这个案例中是一个多对多的关联(注意这里的实体是自动管理生命周期的对象(lifecycle objects),cascade="all"):

  1. <array name="addresses"
  2. table="PersonAddress"
  3. cascade="persist">
  4. <key column="personId"/>
  5. <list-index column="sortOrder"/>
  6. <many-to-many column="addressId" class="Address"/>
  7. </array>

一个map,通过字符串的索引来指明日期:

  1. <map name="holidays"
  2. table="holidays"
  3. schema="dbo"
  4. order-by="hol_name asc">
  5. <key column="id"/>
  6. <map-key column="hol_name" type="string"/>
  7. <element column="hol_date" type="date"/>
  8. </map>

一个组件的列表:(下一章讨论)

  1. <list name="carComponents"
  2. table="CarComponents">
  3. <key column="carId"/>
  4. <list-index column="sortOrder"/>
  5. <composite-element class="CarComponent">
  6. <property name="price"/>
  7. <property name="type"/>
  8. <property name="serialNumber" column="serialNum"/>
  9. </composite-element>
  10. </list>