2、 一对多关联/多对一关联
一对多和多对一关联分为单向关联和双向关联,在此,着重介绍双向关联。假设有两个实体,客户对象(Customer)和订单对象(Order),一个客户可以有多个订单,表现为一对多的关系,一个订单只能属于一个客户,表现为多对一的关系,如图2-1:
图2-1
下面是Customer和Order所对应的映射文件:
● Customer.hbm.xml:
<hibernate-mapping> <class name="hibernate.Customer" table="customer" schema="dbo" catalog="test"> <id name="id" type="java.lang.Long"> <column name="id" /> <generator class="uuid.hex" /> </id> <property name="name" type="java.lang.String"> <column name="name" length="50" not-null="true" /> </property> <set name="Orders" inverse="true" cascade="save-update"> <key> <column name="customer_id" not-null="true" /> </key> <one-to-many class="hibernate.Order" /> </set> </class> </hibernate-mapping>
● Order.hbm.xml:
<hibernate-mapping> <class name="hibernate.Order" table="order" schema="dbo" catalog="test"> <id name="id" type="java.lang.Long"> <column name="id" /> <generator class="uuid.hex" /> </id> <many-to-one name="Customer" class="hibernate.Customer" fetch="select"> <column name="customer_id" not-null="true" /> </many-to-one> <property name="orderName" type="java.lang.String"> <column name="order_name" length="50" not-null="true" /> </property> </class> </hibernate-mapping>
Customer对Order是一对多的关系。一对多具有<key column>属性,key标签总是和本身类(在此本身类是Customer)的主键值相对应。在取得Customer对象时,通过Customer的主键id与Order中的customer_id进行匹配,如果customer.id=order.customer_id,则认为此订单是本客户的,于是加载此学生,把学生对象加入Customer对象的订单集合中。
one-to-many 节点有以下属性:lazy 是否采用延迟加载。inverse 用于标识双向关联中的被动方一端,inverse=false的一方(主控方)负责维护关联关系,默认值 为false。cascade 操作级联(cascade)关系,可选值为all : 所有情况下均进行级联操作;none:所有情况下均不进行级联操作;save-update:在执行save-update时进行级联操作。
更多内容请看PCdog.com--Hibernate高级特性 Hibernate相关文章专题

