昨天初次接觸hibernate,僅僅弄懂了一對一關(guān)系的映射。今天學(xué)習(xí)了一天又有了新的收獲,,弄懂了一對多之間關(guān)系的映射,。 一、一對多的關(guān)系映射 建立一對多關(guān)系關(guān)系的表的原則是將一的一方的主鍵加入到多的一方的表作為外鍵,。這里以員工和部門為例子來演示,。以前不用hibernate時建立pojo類要在員工類Emp中加入一個屬性,即部門編號deptid.使用hibernate則不同了,,需要在“一”的一方類中加入一個set集合,,里面存放“多”的一方的對象。而在“多”的一方的類中需要加入一個“一”方的對象,。也就是說在Dept類中需要加入一個set集合,,存放Emp對象,因為一個部門里面對應(yīng)多個員工,,所以用一個集合來表示,。而每一個員工只能屬于一個部門,所以員工類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類后就要配置這兩個類和表之間的映射關(guān)系了,代碼如下: 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 <!-- 表之間關(guān)系映射 --> 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"指明可以級聯(lián)刪除,級聯(lián)插入數(shù)據(jù),。cascade有四個值:all,、save-update、delete,、none,默認(rèn)就是none,表示不能級聯(lián)操作,。<one-to-many class="com.pojo.Emp"/>表示Dept與Emp是一對多的關(guān)系,他們是以deptId建立關(guān)系的,,即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 <!-- 表之間關(guān)系映射 --> 12 <many-to-one name="dept" column="deptId"></many-to-one> 13 </class> 14 </hibernate-mapping> 這里加了<many-to-one></many-to-one>表示Emp與Dept是多對一的關(guān)系,name="dept"表示在Emp類里面有一個屬性是Dept對對象dept,column="deptId"表示 它們之間是用deptId建立聯(lián)系的,。 下面是級聯(lián)插入數(shù)據(jù)的代碼: 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 級聯(lián)插入數(shù)據(jù) { 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,。級聯(lián)插入只要操作父表,就可以操作子表,。前提是要在前面那個cascade="save-update"必須寫,。
|
|
來自: jp乞巧樓 > 《Hibernate》