一、一對一關聯關系的映射
實體對象之間一對一的關聯關系是通過數據庫中的外鍵實現的。對外鍵的使用有以下兩種方式:
1、主鍵關聯
2、唯一外鍵關聯
主鍵關聯
在一對一的主鍵關聯方式中,不需要借助任何額外的字段,直接通過兩個表的主鍵來形成一對一的映射關系,兩個表共享主鍵。例如,對于學生和學號進行主鍵一對一關聯。首先要在Student對象的配置文件呂定義到Nubmer對象的關聯:
<one-to-noe name="number" class = "Nubmer" cascade="all"/>
還需要在number對象的配置文件中定義到student對象的關聯:
<one-to-one name="student" class="Student" constrained="true" />
在one-to-one中 有constrained屬性表明主鍵同時作為外鍵參照 student表
另外為了確保兩個對象的主鍵相等,在定義主鍵的時候可以使用foreign的Hibernate標識符生成策略來實現這一目的。
<id name="id" column="ID">
<generator class="foreign" >
<param name="property">student</param>
</generator>
</id>
這樣就完成了通過主鍵關聯關系的方式實現對象之間一對一。
唯一外鍵關聯
采用唯一外鍵關聯的方式實際上是一個表的某個外鍵字段關聯到另一個表的主鍵上,這其實是一對多的關聯關系的特例。同樣以學生和學號為例,不同的是在學號對象中包含一個stu_id 字段,這個字段與student對象的id字段相關聯。
首先配置number對象的映射文件
<many-to-one name="student" class="Student" column="STU_ID" unique="true" />
在這里就形成了一個number對象到student對象的單向一對一關系。
接下來在student對象的配置文件進行相應的配置實現對象之間的雙向一對一關聯關系。
<one-to-one name="number" class="Number" property-ref="student" />
這樣就通過唯一外鍵的方式建立了對象之間的一對一的關聯關系。
---------------------------------------------------------------------------------------------------------------
二、一對多關聯關系的映射
一對多的關聯關系在現實生活是很常見的。例如,班級和學生之間就是一對多的關系,一個班級有多個學生。
下面來配置一下單向的一對多的關聯關系。在這里從“一”的這一方開始入手,配置是通過<one-to-many>元素來實現的。
配置Term班級對象的映射文件:
<set name="student" class="Student" cascade="all" inverse="true" >
<key column="term_id"/>
<one-to-mary class="Student"/>
</set>
對于這種單向關聯關系,只能通過一方來實現對另一方的級聯更新操作。
三、多對一關聯關系的映射
多對一的關聯關系是一對多的反向。在實際開發中,將一對多配置為雙向的關聯關系,同時也會將關聯關系的主控方設置為“多”的這一方。這樣就可以避免需要在“多”的一方的關聯字段中插入空值的情況出現。
多對一的關聯關系需要在“多”的這一方使用<many-to-noe >來進行配置。
Student對象的映射文件:
<many-to-one name="term" class="Term" column="TERM_ID" />
另外,為了使“多”的一方變為主控方,還需要配置“一”的一方時增加 inverse="true" 的配置(set屬性)
在對象之間的關聯關系中,inverse="false" 的一方為主控方,由它來負責維護對象之間的關聯關系。
-------------------------------------------------------------------------------------------------------------------------------
四、多對多關聯關系的映射
多對多的關聯關系也是一種常見的對象關聯關系。與其它關系的不同之處就是它需要借助第三張表來實現多對多的關聯關系。
下面看一人例子,我們以學生(Student)和課程(Course)為例。在描述這兩個對象之間的關聯關系時就需要一個中間表Student_Course來確立它們之間的關聯。
在Student中配置一個多對多的關聯
<set name="course"
table="STUDENT_COURSE"
inverse="true"
cascade="save-update">
<key column="ID"/>
<many-to-many column="COURSE_ID" class="course"/>
</set>
同樣在另一個對象(Course)中需要進行如下的配置:
<set name="student"
table="STUDENT_COURSE"
cascade="save-update">
<key column="ID"/>
<many-to-many column="STUDENT_ID" class="student"/>
</set>
需要注意的一點是:對于inverse的配置則根據實際的開發情況來確定哪一方為主控方。