5.1.18. 连接(join)

使用 <join> 元素,假若在表之间存在一对一关联,可以将一个类的属性映射到多张表中。

  1. <join
  2. table="tablename"
  3. schema="owner"
  4. catalog="catalog"
  5. fetch="join|select"
  6. inverse="true|false"
  7. optional="true|false">
  8. <key ... />
  9. <property ... />
  10. ...
  11. </join>
1table: 被连接表的名称。
2schema (可选):覆盖由根&lt;hibernate-mapping&gt;元素指定的模式名称。
3catalog (可选): 覆盖由根 &lt;hibernate-mapping&gt;元素指定的目录名称。
4fetch (可选 - 默认是 join): 如果设置为默认值join, Hibernate 将使用一个内连接来得到这个类或其超类定义的&lt;join&gt;,而使用一个外连接来得到其子类定义的&lt;join&gt;。如果设置为select,则 Hibernate 将为子类定义的 &lt;join&gt;使用顺序选择。这仅在一行数据表示一个子类的对象的时候才会发生。对这个类和其超类定义的&lt;join&gt;,依然会使用内连接得到。
5inverse (可选 - 默认是 false): 如果打开,Hibernate 不会插入或者更新此连接定义的属性。
6optional (可选 - 默认是 false): 如果打开,Hibernate 只会在此连接定义的属性非空时插入一行数据,并且总是使用一个外连接来得到这些属性。

例如,一个人(person)的地址(address)信息可以被映射到单独的表中(并保留所有属性的值类型语义):

  1. <class name="Person"
  2. table="PERSON">
  3. <id name="id" column="PERSON_ID">...</id>
  4. <join table="ADDRESS">
  5. <key column="ADDRESS_ID"/>
  6. <property name="address"/>
  7. <property name="zip"/>
  8. <property name="country"/>
  9. </join>
  10. ...

此特性常常对遗留数据模型有用,我们推荐表个数比类个数少,以及细粒度的领域模型。然而,在单独的继承树上切换继承映射策略是有用的,后面会解释这点。