5.1.18. 连接(join)

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

<join
        table="tablename"
        schema="owner"
        catalog="catalog"
        fetch="join|select"
        inverse="true|false"
        optional="true|false">

        <key ... />

        <property ... />
        ...
</join>
1 table: 被连接表的名称。
2 schema (可选):覆盖由根&lt;hibernate-mapping&gt;元素指定的模式名称。
3 catalog (可选): 覆盖由根 &lt;hibernate-mapping&gt;元素指定的目录名称。
4 fetch (可选 - 默认是 join): 如果设置为默认值join, Hibernate 将使用一个内连接来得到这个类或其超类定义的&lt;join&gt;,而使用一个外连接来得到其子类定义的&lt;join&gt;。如果设置为select,则 Hibernate 将为子类定义的 &lt;join&gt;使用顺序选择。这仅在一行数据表示一个子类的对象的时候才会发生。对这个类和其超类定义的&lt;join&gt;,依然会使用内连接得到。
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>
    ...

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