这是一个Class映射到多个table的情况。
一个叫做Address的类:
表结构如下:
CREATE TABLE ADDR (
STREET VARCHAR(255) PRIMARY KEY,
CITY VARCHAR(255),
STATE CHAR(2),
ZIPCODE VARCHAR(10)
)
CREATE TABLE DELIV (
ADDR_STREET VARCHAR(255),
SIG_REQUIRED BIT,
DELIV_INS CLOB
)
CREATE TABLE MAPQUEST_INFO (
ADDR_STREET VARCHAR(255),
MAPQUEST_IMAGE BLOB
)
映射文件内容如下:
<orm>
<package name="com.xyz">
<class name="Address" table="ADDR">
<!-- shared join condition used by fields in DELIV -->
<join table="DELIV" column="ADDR_STREET"/>
<field name="street" column="STREET"/>
<field name="city" column="CITY"/>
<field name="state" column="STATE"/>
<field name="zip" column="ZIPCODE"/>
<field name="signatureRequired" table="DELIV" column="SIG_REQUIRED"/>
<field name"deliveryInstructions" table="DELIV">
<column name="DELIV_INS" jdbc-type="CLOB"/>
</field>
<field name="mapJPG" table="MAPQUEST_INFO" column="MAPQUEST_IMAGE">
<!-- join condition defined for this field only -->
<join column="ADDR_STREET"/>
</field>
</class>
</package>
</orm>
解读:
这里使用了join这个元素把多个表映射到了一个Class上,我们暂且把Class定义的Table称作是主表,其他叫做子表。使用了两种方式:
1.<join table="DELIV" column="ADDR_STREET"/>,这是设置一个共享的join元素,凡是使用table="DELIV"定义的field都是映射自表DELIV,也就是这个Class多个field映射到了一个子表上。如:<field name="signatureRequired" table="DELIV" column="SIG_REQUIRED"/>
和 <field name"deliveryInstructions" table="DELIV">
<column name="DELIV_INS" jdbc-type="CLOB"/>
</field>
而column="ADDR_STREET"表明表DELIV是通过ADDR_STREET这个列来和主表(也就是ADDR)做关联的。
2.一个filed映射到一个子表:
<field name="mapJPG" table="MAPQUEST_INFO" column="MAPQUEST_IMAGE">
<!-- join condition defined for this field only -->
<join column="ADDR_STREET"/>
</field>
同样,join元素里的column="ADDR_STREET"表示通过ADDR_STREET这个列来和主表(也就是ADDR)做关联。
需要注意的是,关联使用的column必须是主键才行。
使用这个文件,我们就把一个Class拆开来映射到多个table上了。