关于Hibernate的关联关系及其操作
【IT168 技术文档】
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:
对于<many-to-one>标签具有column属性,column属性总是和关联类的主键id相对应(对于Order来说,关联类是Customer),因此Hibernate会根据order表中的customer_id以及customer表中设置的id列,取出order.customer_id=customer.id的记录,构造成Customer对象返回给Order类。<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时进行级联操作。
0
相关文章