Hibernate框架常用映射

       簡介:Hibernate是一個典型的開源ORM框架,ORM(Object Relational Mapping)即對象關係映射,它是對JDBC的進一步封裝,將在工程中創建的對象模型與數據庫數據庫的表建立映射關係,它會自動生成SQL語句並執行,在數據庫中創建出相對應的表。這樣就可以通過面向對象的思維進而操作數據庫。

       基本介紹:首先Hibernate中相當於提供了一個工廠即SessionFactory,這個工廠可以創建Session對象,而創建出來的Session對象通過save,delete,update,get等方法包裝了基本SQL語句,如此一來就可以通過這些基本方法對對象進行增刪改查操作。除此之外Hibernate還封裝了關於事務控制的操作,只需要在事務邊界進行聲明即可。

       關係配置:

1、多對一:

       多對一的關聯映射,是很常用的一種關聯映射,例如:學生對班級就是多對一的關聯映射,在數據庫中的表現形式爲:在學生表中會有一個外鍵字段(classId)指向班級表,參照班級表的主鍵,而在對象模型中的體現爲在學生的Demo類中會持有班級Demo的一個引用,作爲學生Demo類的一個屬性存在。

其映射關係配置如下:

在學生Demo類的映射文件中配置爲:

<hibernate-mapping>
	<class name="com.rcj.hibernate.Student" table="t_student">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="class" column="classid" cascade="save-update"/>
	</class>
</hibernate-mapping>
       其中在<many-to-one>標籤中的cascade爲級聯配置,表示在做添加和更新時做級聯操作,級聯的意思爲:當一個表發生更新時,其他引用該表相關字段的表也會隨之更新。該操作在樹形結構中子父關係的操作中十分常用,而且十分方便。除了可以配置爲save-update(添加和更新時級聯操作)之外,還可以配置爲:all(所有操作都級聯),delete(刪除級聯),none(所有操作都不級聯)。

在班級Demo類的映射文件中配置爲:

<hibernate-mapping>
	<class name="com.rcj.hibernate.Class" table="t_class">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
	</class>
</hibernate-mapping>

2、一對多:

         一對多的關聯映射也很常用,一對多的關聯映射和多對一的關聯映射原理是相同的,他們都是在多的一端維護關係,就是多的一端有一個外鍵指向一的一端。區別只是:指向不同而已,即加載時機不同,被指向的一方會隨着主動指向的一方的加載而記載。其配置文件如下:

在學生Demo類的映射文件中配置如下:

<hibernate-mapping>
	<class name="com.rcj.hibernate.Student" table="t_student">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="classes" column="classesid"/>
	</class>
</hibernate-mapping>
在班級Demo類的映射文件中配置如下:

<pre name="code" class="html"><hibernate-mapping>
	<class name="com.rcj.hibernate.Classes" table="t_classes">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="students" inverse="true">
			<key column="classesid"/>
			<one-to-many class="com.rcj.hibernate.Student"/>
		</set>
	</class>
</hibernate-mapping>

       在此說明一下其中的inverse屬性:inverse屬性設置爲true的作用表示,本端不再維護關係,交由另一端維護關係,這個不是必須的,但是配置是爲了提高性能,如果不配置該項會導致在添加班級的過程中執行大量無用的update語句,所以配置上該項可以提高性能。而且需要注意的是:key標籤和上邊的many-to-one標籤中的column字段需要一致,否則會導致表結構混亂,因爲這是同一個字段的說明。


3、一對一:

       一對一有主鍵關聯映射和唯一外鍵關聯映射,常用的爲唯一外鍵關聯,下面以一個人一個身份證爲例來說明唯一外鍵關聯映射。

       其實一對一唯一外鍵關聯映射爲多對一映射的一個特例。下面先看看其配置文件。

人的Demo類的配置信息:

<hibernate-mapping>
	<class name="com.rcj.hibernate.Person" table="t_person">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="idCard" unique="true"/>
	</class>
</hibernate-mapping>
身份證Demo類的配置信息:

<hibernate-mapping>
	<class name="com.rcj.hibernate.IdCard" table="t_idCard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
		<one-to-one name="person" property-ref="idCard"/>
	</class>
</hibernate-mapping>
其配置的特點爲:在many-to-one標籤中添加了unique屬性,用來限制多的一段不重複,就構成了一對一的關聯映射。下邊的one-to-one標籤表示IdCard類對Person類的一種指向關係,因爲在這裏是一種雙向關聯關係。

4、多對多:

       多對多的關聯映射在數據庫中的體現爲:數據庫中會新建一個表來維護兩個表之間的關係,在對象模型中的體現爲,雙方各持有對方的一個set集合引用。下面就是其配置信息。

學生Demo類配置信息

<hibernate-mapping>
	<class name="com.rcj.hibernate.Student" table="t_student">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="courses" table="t_student_course">
			<key column="student_id" not-null="true"/>
			<many-to-many class="com.rcj.hibernate.Course" column="course_id" />	
		</set>
	</class>
</hibernate-mapping>
課程Demo類配置信息

<pre name="code" class="html"><hibernate-mapping>
	<class name="com.rcj.hibernate.Course" table="t_course">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="students" table="t_student_course">
			<key column="course_id" not-null="true"/>
			<many-to-many class="com.rcj.hibernate.Student" column="student_id"/>
		</set>
	</class>
</hibernate-mapping>

此處需要注意的是:由於雙方配置的表名是同一個表,所以表名一定要相同。


發佈了90 篇原創文章 · 獲贊 57 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章