在域模型中,类与类之间最普遍的关系就是关联关系.以客户(Customer)和订单(Order)的关系为例,一个客户能发出多个订单,而一个订单只属于一个客户.从Order到Customer的关联是多对一关联,每个Order对象都会引用一个Customer对象,因此在Order类中应该定义一个Customer类型的属性.
从Customer到Order是一对多关联,意味着每个Customer对象都会引用一组Order对象,因此在Customer类中应该定义一个集合类型的属性,来引用所有Order对象.
多对一的单向关联关系:
customer.hbm.xml
<hibernate-mapping>
<class name="Customer" table="CUSTOMERS">
<id>
…………
</class>
</hibernate-mapping>
order.hbm.xml
<hibernate-mapping>
<class name="Order" table="ORDER">
<id>
…………
<many-to-one name="customer" column="CUSTOMER_ID" class="Customer" not-null="true"/>
</class>
</hibernate-mapping>
级联保存和更新
在<many-to-one>中加入cascade="save-update" 默认为none
一对多的双向关联关系,从内存中读取比数据库中快,所有针对大量的根据客户查询订单的操作,需要使用双向。
customer.hbm.xml
<hibernate-mapping>
<class name="Customer" table="CUSTOMERS">
<id>
…………
<set name="orders" cascade="save-update" inverse="true"> //根据Orders变化来同步两张表
<key column="CUSTOMER_ID"/> //cascade="true"级联删除,删除了客户信息,订单也自动删除
<one -to-many class="Order">
</set>
</class>
</hibernate-mapping>
order.hbm.xml
<hibernate-mapping>
<class name="Order" table="ORDER">
<id>
…………
<many-to-one name="customer" column="CUSTOMER_ID" class="Customer" not-null="true"/>
</class>
</hibernate-mapping>