hibernate中一對多關係的映射

一、一對多的關係映射

  建立一對多關係關係的表的原則是將一的一方的主鍵加入到多的一方的表作爲外鍵。這裏以員工和部門爲例子來演示。以前不用hibernate時建立pojo類要在員工類Emp中加入一個屬性,即部門編號deptid.使用hibernate則不同了,需要在“一”的一方類中加入一個set集合,裏面存放“多”的一方的對象。而在“多”的一方的類中需要加入一個“一”方的對象。也就是說在Dept類中需要加入一個set集合,存放Emp對象,因爲一個部門裏面對應多個員工,所以用一個集合來表示。而每一個員工只能屬於一個部門,所以員工類Emp裏面需要加入一個Depe類對象,表示所屬部門。部門類和員工類的代碼如下 

複製代碼
 1 public class Dept implements Serializable {
 2     private int deptId;
 3     private String deptName;
 4     private Set<Emp> emps = new HashSet<Emp>();
 5     public int getDeptId() {
 6         return deptId;
 7     }
 8     public void setDeptId(int deptId) {
 9         this.deptId = deptId;
10     }
11     public String getDeptName() {
12         return deptName;
13     }
14     public void setDeptName(String deptName) {
15         this.deptName = deptName;
16     }
17     public Set<Emp> getEmps() {
18         return emps;
19     }
20     public void setEmps(Set<Emp> emps) {
21         this.emps = emps;
22     }
23 }
複製代碼
複製代碼
 1 public class Emp implements Serializable{
 2     private int empNo;
 3     private String empName;
 4     private Date empBirthday;
 5     private Dept dept;
 6     public int getEmpNo() {
 7         return empNo;
 8     }
 9     public void setEmpNo(int empNo) {
10         this.empNo = empNo;
11     }
12     public String getEmpName() {
13         return empName;
14     }
15     public void setEmpName(String empName) {
16         this.empName = empName;
17     }
18     public Date getEmpBirthday() {
19         return empBirthday;
20     }
21     public void setEmpBirthday(Date empBirthday) {
22         this.empBirthday = empBirthday;
23     }
24     public Dept getDept() {
25         return dept;
26     }
27     public void setDept(Dept dept) {
28         this.dept = dept;
29     }
30     
31 }
複製代碼

  寫完pojo類後就要配置這兩個類和表之間的映射關係了,代碼如下:

1.Dept.hbm.xml

複製代碼
 1 <hibernate-mapping>
 2     <!-- 表和類之間的映射 -->
 3     <class name="com.pojo.Dept" table="dept">
 4         <!-- 主鍵映射 -->
 5         <id name="deptId" column="deptId">
 6             <generator class="native"></generator>
 7         </id>
 8         <!-- 屬性映射 -->
 9         <property name="deptName" column="deptName" length="50"></property>
10         <!-- 表之間關係映射 -->
11         <set name="emps" cascade="save-update,delete">
12             <key column="deptId"></key>
13             <one-to-many class="com.pojo.Emp"/>
14         </set>
15     </class>
16 </hibernate-mapping>
複製代碼

這裏面配置了一個set,裏面的name="emps"表示在Dept類裏的屬性emps,它是一個集合,存放Emp對象的。cascade="save-update,delete"指明可以級聯刪除,級聯插入數據。cascade有四個值:all、save-update、delete、none,默認就是none,表示不能級聯操作。<one-to-many class="com.pojo.Emp"/>表示Dept與Emp是一對多的關係,他們是以deptId建立關係的,即deptId是Emp的外鍵。

2.Emp.hbm.xml

複製代碼
 1 <hibernate-mapping>
 2     <!-- 表和類之間的映射 -->
 3     <class name="com.pojo.Emp" table="emp">
 4         <!-- 主鍵映射 -->
 5         <id name="empNo" column="empNo">
 6             <generator class="native"></generator>
 7         </id>
 8         <!-- 屬性映射 -->
 9         <property name="empName" column="empName" length="50"></property>
10         <property name="empBirthday" column="empBirthday"></property>
11         <!-- 表之間關係映射 -->
12         <many-to-one name="dept" column="deptId"></many-to-one>
13     </class>
14 </hibernate-mapping>
複製代碼

  這裏加了<many-to-one></many-to-one>表示Emp與Dept是多對一的關係,name="dept"表示在Emp類裏面有一個屬性是Dept對對象dept,column="deptId"表示 它們之間是用deptId建立聯繫的。

下面是級聯插入數據的代碼:

複製代碼
 1 package com.test;
 2 
 3 import java.util.Date;
 4 
 5 import org.hibernate.Session;
 6 import org.hibernate.Transaction;
 7 
 8 import com.pojo.Dept;
 9 import com.pojo.Emp;
10 import com.util.DBUtil;
11 
12 public class 級聯插入數據 {
13 
14     /**
15      * @param args
16      */
17     public static void main(String[] args) {
18         //獲得session
19         Session session = DBUtil.getSession();
20         //新建一個dept
21         Dept dept = new Dept();
22         dept.setDeptName("吃飯部");
23         
24         //新建emp
25         Emp e1 = new Emp();
26         e1.setEmpName("李白");
27         e1.setEmpBirthday(new Date());
28         
29         Emp e2 = new Emp();
30         e2.setEmpName("王維");
31         e2.setEmpBirthday(new Date());
32         
33         dept.getEmps().add(e1);
34         dept.getEmps().add(e2);
35         
36         Transaction tr = session.beginTransaction();
37         try {
38             session.save(dept);
39             tr.commit();
40         } catch (Exception e) {
41             tr.rollback();
42         }finally{
43             session.close();
44         }
45     }
46 
47 }
複製代碼

先建立一個dept對象,然後建立兩個emp對象,然後把這兩個emp對象加入到dept對象的集合裏面,然後保存dept。級聯插入只要操作父表,就可以操作子表。前提是要在前面那個cascade="save-update"必須寫。

轉自:http://www.cnblogs.com/liuling/archive/2013/01/14/231df213as32.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章