6.2.5. 一对多关联(One-to-many Associations)

一对多关联__通过外键连接两个类对应的表,而没有中间集合表。 这个关系模型失去了一些Java集合的语义:

  • 一个被包含的实体的实例只能被包含在一个集合的实例中

  • 一个被包含的实体的实例只能对应于集合索引的一个值中

一个从ProductPart的关联需要关键字字段,可能还有一个索引字段指向Part所对应的表。 <one-to-many>标记指明了一个一对多的关联。

  1. <one-to-many
  2. class="ClassName"
  3. not-found="ignore|exception"
  4. entity-name="EntityName"
  5. node="element-name"
  6. embed-xml="true|false"
  7. />
1class(必须):被关联类的名称。
2not-found (可选 - 默认为exception): 指明若缓存的标示值关联的行缺失,该如何处理: ignore 会把缺失的行作为一个空关联处理。
3entity-name (可选): 被关联的类的实体名,作为class的替代。

例子

  1. <set name="bars">
  2. <key column="foo_id"/>
  3. <one-to-many class="org.hibernate.Bar"/>
  4. </set>

注意:&lt;one-to-many&gt;元素不需要定义任何字段。 也不需要指定表名。

重要提示:如果一对多关联中的外键字段定义成NOT NULL,你必须把&lt;key&gt;映射声明为not-null="true",或者使用双向关联,并且标明inverse="true"。参阅本章后面关于双向关联的讨论。

下面的例子展示一个Part实体的map,把name作为关键字。( partNamePart的持久化属性)。注意其中的基于公式的索引的用法。

  1. <map name="parts"
  2. cascade="all">
  3. <key column="productId" not-null="true"/>
  4. <map-key formula="partName"/>
  5. <one-to-many class="Part"/>
  6. </map>