精通hibernate学习笔记(3)[关联关系]
关联关系分:单向关联(一对多、多对一)和双向关联(一对多双向)
在关系数据库中,只存在外键参照关系,而且总是由“many”方参照“one”方,因为这样才能消除数据冗余,因此关系数据库实际上只支持多对一或一对一的单项关联。
1、单向关联及级联保存和更新
Order 和 Customer存在多对一的关系,在Order映射文件中可以设置为:
<many-to-one
??????? name="customer"
??????? column="CUSTOMER_ID"
??????? width="591" alt="精通hibernate学习札记(3)[关联关系]" src="/img/2012/09/24/094928235.jpg">
如果使用级联保存和更新那么可以解决这个问题:
<many-to-one
??????? name="customer"
??????? column="CUSTOMER_ID"
??????? cascade="save-update">
????? <key column="CUSTOMER_ID"/>
????? <one-to-many cascade="save-update" inverse="true">
????? <key column="CUSTOMER_ID"/>
????? <one-to-many column="PRODUCT_ID"/>
property-ref属性只应该用来对付遗留下来的数据库系统, 可能有外键指向对方关联表的是个非主键字段(但是应该是一个惟一关键字)的情况下。 这是一种十分丑陋的关系模型。比如说,假设Product类有一个惟一的序列号, 它并不是主键。(unique属性控制Hibernate通过SchemaExport工具进行的DDL生成。)
<property name="serialNumber" unique="true" type="string" column="SERIAL_NUMBER"/>
那么关于OrderItem 的映射可能是:
<many-to-one name="product" property-ref="serialNumber" column="PRODUCT_SERIAL_NUMBER"/>
当然,我们决不鼓励这种用法。
如果被引用的唯一主键由关联实体的多个属性组成,你应该在名称为<properties>的元素 里面映射所有关联的属性。
假若被引用的唯一主键是组件的属性,你可以指定属性路径:
<many-to-one name="owner" property-ref="identity.ssn" column="OWNER_SSN"/>
------------------------------------------------------------------------
3、级联删除
如果在删除customer的时候,将其关联的orders也删除只需要设置cascade=delete
<set name="orders" casecade="delete" inverse="true">
???? <key column="CUSTOMER_ID"/>
????? <one-to-many cascade="all-delete-orphan" inverse="true">
???? <key column="CUSTOMER_ID"/>
????? <one-to-many width="523" alt="精通hibernate学习札记(3)[关联关系]" src="/img/2012/09/24/094928236.jpg">
每个Category可能有其(0或1个)父类和(多个子类),其映射文件如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping >
? <class name="mypack.Category" table="CATEGORIES" >
??? <id name="id" type="long" column="ID">
????? <generator type="string" >
??????? <column name="NAME" length="15" />
??? </property>
??? <set
??????? name="childCategories"
??????? cascade="save-update"
??????? inverse="true"
??????? >
??????? <key column="CATEGORY_ID" />
??????? <one-to-many />
???? </set>??
?? <many-to-one
??????? name="parentCategory"
??????? column="CATEGORY_ID"
??????? width="300" alt="精通hibernate学习札记(3)[关联关系]" src="/img/2012/09/24/094928237.jpg">
父类别的映射为:
?? <many-to-one
??????? name="parentCategory"
??????? column="CATEGORY_ID"
??????? />
??????? <one-to-many />
???? </set>
原理:
<one-to-many>表示单个该类对象对应多个子类别;[以主键去匹配外键]
<one-to-many>元素表示以该记录对应的表的主键(ID)去匹配"mypack.Category"对应的表中的"CATEGORY_ID"字段;
?