使用 <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>
    ...

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