昨天初次接觸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"必須寫。