使用 <join> 元素,假若在表之间存在一对一关联,可以将一个类的属性映射到多张表中。
<join
table="tablename" (1)
schema="owner" (2)
catalog="catalog" (3)
fetch="join|select" (4)
inverse="true|false" (5)
optional="true|false"> (6)
<key ... />
<property ... />
...
</join>| (1) | table: 被连接表的名称。 |
| (2) | schema (可选):覆盖由根<hibernate-mapping>元素指定的模式名称。 |
| (3) | catalog (可选): 覆盖由根 <hibernate-mapping>元素指定的目录名称。 |
| (4) | fetch (可选 - 默认是 join): 如果设置为默认值join, Hibernate 将使用一个内连接来得到这个类或其超类定义的<join>,而使用一个外连接来得到其子类定义的<join>。如果设置为select,则 Hibernate 将为子类定义的 <join>使用顺序选择。这仅在一行数据表示一个子类的对象的时候才会发生。对这个类和其超类定义的<join>,依然会使用内连接得到。 |
| (5) | inverse (可选 - 默认是 false): 如果打开,Hibernate 不会插入或者更新此连接定义的属性。 |
| (6) | optional (可选 - 默认是 false): 如果打开,Hibernate 只会在此连接定义的属性非空时插入一行数据,并且总是使用一个外连接来得到这些属性。 |
例如,一个人(person)的地址(address)信息可以被映射到单独的表中(并保留所有属性的值类型语义):
<class name="Person"
table="PERSON">
<id name="id" column="PERSON_ID">...</id>
<join table="ADDRESS">
<key column="ADDRESS_ID"/>
<property name="address"/>
<property name="zip"/>
<property name="country"/>
</join>
...此特性常常对遗留数据模型有用,我们推荐表个数比类个数少,以及细粒度的领域模型。然而,在单独的继承树上切换继承映射策略是有用的,后面会解释这点。