【Hibernate】——多對一映射

          什麼是映射?


           小編這裏總結一年Hibernate的關聯映射,這篇博文主要講多對一的關聯映射。

           首先要知道什麼是映射?簡單的說,一個蘿蔔一個坑就是一種映射關係。數學上來說,y = ax^2 + bx + c,就

是x到y 的映射。


           Hibernate的基本映射?


           而hibernate的基本映射是指:一個類(class)對應一個實體。在映射文件中,實體的標識字段用<id>,

generator指主鍵的生成策略,常用的有:native、uuid、assigned、identity、sequence、foreign;普通屬性字段用

<property>,如下:

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Role" table="t_role">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>			
	</class>
</hibernate-mapping>

            除此之外我們還需要掌握實體類的設計原則:

            1、實現無參的默認構造函數

            2、提供一個標識(一般爲id)

            3、不要使用final修飾實體類

            4、爲實體類生成getter和setter方法

            下邊進入正題了~


             對象關聯映射?

    

            關聯映射是指將關聯關係映射到數據庫中,在對象模型中就是一個或多個引用。對象的關聯映射分爲:多對

一(一對多)、一對一、多對多。今天我們主要講多對一的情況。

           

            多對一關聯映射


            多對一映射原則:在多的一端加入一個外鍵,指向一的一端,如圖:


             一個組裏有多個用戶,所以在用戶表裏加入一個外鍵groupid。

             新建Group實體類:

package com.bjpowernode.hibernate;
/**
 * 建立Group實體類
 * @author why_768
 *
 */
public class Group {
	private int id;
	
	private String name;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

             新建User實體類:

package com.bjpowernode.hibernate;
/**
 * 建立User實體類
 * @author why_768
 *
 */
public class User {
	private int id;
	private String name;
	private Group group;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Group getGroup() {
		return group;
	}
	public void setGroup(Group group) {
		this.group = group;
	}
		
}
 
              接下來新建實體類對應的映射文件,Group.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Group" table="t_group">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>		
	</class>
</hibernate-mapping>

              User.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.bjpowernode.hibernate.User">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <many-to-one name="group" column="groupid" cascade="save-update"/>
    </class>
</hibernate-mapping>

             看到User.hbm.xml文件裏的<many-to-one>就是多對一的標識,column指對group進行重命名,這個groupid

會在數據庫中有對應的字段,cascade(級聯)是對多一關係中的重要屬性,它是對象之間的連鎖操作,隻影響添

加、刪除和修改,對查詢時沒有影響的。cascade主要屬性有:

             1、all:在所有的情況下都執行級聯操作,這裏的所有指:增、刪、改三種情況下。

             2、none:在所有情況下都不執行級聯操作。

             3、save-update:保存和更新時執行級聯操作。

             4、delete:僅在刪除操作時執行級聯操作。


             下邊用Junit寫測試類:

      public void testSave1(){
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Group group = new Group();
			group.setName("動力節點");
			
			User user1=new User();
			user1.setName("張三");
			user1.setGroup(group);
			
			User user2=new User();
			user2.setName("李四");
			user2.setGroup(group);
			
			session.save(user1);
			session.save(user2);
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally{
			HibernateUtils.closeSession(session);
		}
	}
              控制檯輸出如下語句:

Hibernate: insert into t_group (name) values (?)
Hibernate: insert into User (name, groupid) values (?, ?)
Hibernate: insert into User (name, groupid) values (?, ?)

             查數據庫,數據已經保存到數據庫了:



            多對一的關係相對來說還是比較簡單的,下一篇博客說下多對一的反例:一對多關聯關係的實現。

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