6.2.3. 索引集合类(Indexed collections)

所有的集合映射,除了set和bag语义的以外,都需要指定一个集合表的索引字段(index column)——用于对应到数组索引,或者List的索引,或者Map的关键字。通过<map-key>,Map 的索引可以是任何基础类型;若通过<map-key-many-to-many>,它也可以是一个实体引用;若通过<composite-map-key>,它还可以是一个组合类型。数组或列表的索引必须是integer类型,并且使用 <list-index>元素定义映射。被映射的字段包含有顺序排列的整数(默认从0开始)。

  1. <map-key
  2. column="column_name"
  3. formula="any SQL expression"
  4. type="type_name"
  5. node="@attribute-name"
  6. length="N"/>
1column(可选):保存集合索引值的字段名。
2formula (可选): 用于计算map关键字的SQL公式
3type (必须):映射键(map key)的类型。
  1. <map-key-many-to-many
  2. column="column_name"
  3. formula="any SQL expression"
  4. class="ClassName"
  5. />
1column(可选):集合索引值中外键字段的名称
2formula (可选): 用于计算map关键字的外键的SQL公式
3class (必需):映射的键(map key)使用的实体类。

假若你的表没有一个索引字段,当你仍然希望使用List作为属性类型,你应该把此属性映射为Hibernate <bag>。从数据库中获取的时候,bag不维护其顺序,但也可选择性的进行排序。

从集合类可以产生很大一部分映射,覆盖了很多常见的关系模型。我们建议你试验schema生成工具,来体会一下不同的映射声明是如何被翻译为数据库表的。