一对一关联关系:
①主键关联:
为了表示一对一关系,在两个映射表中都要使用<one-to-one>标记。
以company和Login之间的一对一关联关系。他们共享一个主键id,这个主键可由company或login表生成。
问题是如何让另一张表引用已经生成的主键值呢?
这就要在hibernate的映射文件中使用主键的foreign生成机制。
company.hbm.xml: <!--映射company与login的一对一主键关联--> <one-to-one name="login" cascade="all" class="PO.Login" lazy="false" fetch="join" outer-join="true"/> Login.hbm.xml:
<span style="color:#ff0000;"><id column="ID" name="id" type="integer"></span>
<span style="color:#ff0000;"><span style="white-space:pre"> </span><generator class="foreign"></span>
<span style="color:#ff0000;"><span style="white-space:pre"> </span><param name="property">company</param></span>
<span style="color:#ff0000;"><span style="white-space:pre"> </span></generator></span>
<span style="color:#ff0000;"></id></span>
<!--映射company与login的一对一关联。--> <one-to-one name="company" class="PO.Company" constrained="true"/>
②外键关联:
外键关联的要点是两个表各有不同的主键,但其中一个表有一个外键引用另一个表的主键
以Client和Address表为例,Client类的address为外键引用Address类的对应表中的主键,设置address为unique的值为true,即这个外键是唯一的,即成为一对一关系。
Address.hbm.xml:
<!--映射Client与Address的一对一外键关联--> <one-to-one name="client" class="PO.Client" property-ref="address"/>
Client.hbm.xml:
该表中有address字段
<!--映射Client到Address的一对一外键关联,唯一的多对一,实际上变成了一对一关系--> <many-to-one name="address" class="PO.Address" column="address" cascade="all" lazy="false" unique="true"/>
一对多关联关系
①单向关联:
以Customer(客户)与订单(Orders)为例
Customer.hbm.xml:
<!--一对多双向关联映射 customer到orders,单的一方配置--> <set name="orders" table="orders" cascade="all" inverse="true" lazy="false" sort="natural"> <key column="CUSTOMER_ID"/> <one-to-many class="PO.Orders"/> </set><key>子元素的column属性指定关联表的外键(此处为orders表)
<one-to-many>的class属性指定了关联类的名字
Orders.hbm.xml:
<!--一对多双向关联映射中多的一方配置--> <many-to-one name="customer" class="PO.Customer" column="CUSTOMER_ID" lazy="false" not-null="true"/>
Items.hbm.xml:
<!--映射Items到Orders的多对多关联--> <set name="orders" table="selecteditems" cascade="save-update" inverse="true" lazy="true"> <key column="ITEMID"/> <many-to-many class="PO.Orders" column="ORDERID"/> </set>
<!--映射Orders到Items的多对多关联--> <set name="items" table="selecteditems" cascade="save-update" lazy="true"> <key column="ORDERID"/> <many-to-many class="PO.Items" column="ITEMID"/> </set>