5.1.18. 连接(join)
使用 <join>
元素,假若在表之间存在一对一关联,可以将一个类的属性映射到多张表中。
<join
table="tablename"
schema="owner"
catalog="catalog"
fetch="join|select"
inverse="true|false"
optional="true|false">
<key ... />
<property ... />
...
</join>
table : 被连接表的名称。 |
|
---|---|
schema (可选):覆盖由根<hibernate-mapping> 元素指定的模式名称。 |
|
catalog (可选): 覆盖由根 <hibernate-mapping> 元素指定的目录名称。 |
|
fetch (可选 - 默认是 join ): 如果设置为默认值join , Hibernate 将使用一个内连接来得到这个类或其超类定义的<join> ,而使用一个外连接来得到其子类定义的<join> 。如果设置为select ,则 Hibernate 将为子类定义的 <join> 使用顺序选择。这仅在一行数据表示一个子类的对象的时候才会发生。对这个类和其超类定义的<join> ,依然会使用内连接得到。 |
|
inverse (可选 - 默认是 false ): 如果打开,Hibernate 不会插入或者更新此连接定义的属性。 |
|
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>
...
此特性常常对遗留数据模型有用,我们推荐表个数比类个数少,以及细粒度的领域模型。然而,在单独的继承树上切换继承映射策略是有用的,后面会解释这点。