hibernate中一对多关系的映射

本文详细介绍了在Hibernate框架下如何通过一对多关系映射实现员工与部门之间的关联,包括构建POJO类、配置映射关系以及级联插入数据的操作流程。

一、一对多的关系映射

建立一对多关系表的原则是将一的一方的主键加入到多的一方的表作为外键。这里以员工和部门为例子来演示。以前不用hibernate时建立pojo类要在员工类Emp中加入一个属性,即部门编号deptid.使用hibernate则不同了,需要在“一”的一方类中加入一个set集合,里面存放“多”的一方的对象。而在“多”的一方的类中需要加入一个“一”方的对象。也就是说在Dept类中需要加入一个set集合,存放Emp对象,因为一个部门里面对应多个员工,所以用一个集合来表示。而每一个员工只能属于一个部门,所以员工类Emp里面需要加入一个Depe类对象,表示所属部门。部门类和员工类的代码如下 

  public class Dept implements Serializable {
      private int deptId;
      private String deptName;
      private Set<Emp> emps = new HashSet<Emp>();
      public int getDeptId() {
          return deptId;
      }
      public void setDeptId(int deptId) {
          this.deptId = deptId;
     }
     public String getDeptName() {
         return deptName;
     }
     public void setDeptName(String deptName) {
         this.deptName = deptName;
     }
     public Set<Emp> getEmps() {
         return emps;
     }
     public void setEmps(Set<Emp> emps) {
         this.emps = emps;
     }
 }
  public class Emp implements Serializable{
      private int empNo;
      private String empName;
      private Date empBirthday;
      private Dept dept;
      public int getEmpNo() {
          return empNo;
      }
      public void setEmpNo(int empNo) {
         this.empNo = empNo;
     }
     public String getEmpName() {
        return empName;
     }
     public void setEmpName(String empName) {
         this.empName = empName;
     }
     public Date getEmpBirthday() {
         return empBirthday;
     }
     public void setEmpBirthday(Date empBirthday) {
         this.empBirthday = empBirthday;
     }
     public Dept getDept() {
         return dept;
     }
     public void setDept(Dept dept) {
         this.dept = dept;
     }

 }

写完pojo类后就要配置这两个类和表之间的映射关系了,代码如下:

1.Dept.hbm.xml

  <hibernate-mapping>
      <!-- 表和类之间的映射 -->
     <class name="com.pojo.Dept" table="dept">
          <!-- 主键映射 -->
          <id name="deptId" column="deptId">
              <generator class="native"></generator>
          </id>
          <!-- 属性映射 -->
          <property name="deptName" column="deptName" length="50"></property>
         <!-- 表之间关系映射 -->
         <set name="emps" cascade="save-update,delete">
             <key column="deptId"></key>
             <one-to-many class="com.pojo.Emp"/>
         </set>
     </class>
 </hibernate-mapping>

这里面配置了一个set,里面的name="emps“表示在Dept类里的属性emps,它是一个集合,存放Emp对象的。cascade="save-update,delete"指明可以级联删除,级联插入数据。cascade有四个值:allsave-updatedeletenone,默认就是none,表示不能级联操作。<one-to-many class="com.pojo.Emp"/>表示DeptEmp是一对多的关系,他们是以deptId建立关系的,即deptIdEmp的外键。

2.Emp.hbm.xml


  <hibernate-mapping>
      <!-- 表和类之间的映射 -->
      <class name="com.pojo.Emp" table="emp">
          <!-- 主键映射 -->
          <id name="empNo" column="empNo">
              <generator class="native"></generator>
          </id>
          <!-- 属性映射 -->
          <property name="empName" column="empName" length="50"></property>
         <property name="empBirthday" column="empBirthday"></property>
         <!-- 表之间关系映射 -->
         <many-to-one name="dept" column="deptId"></many-to-one>
     </class>
 </hibernate-mapping>

这里加了<many-to-one></many-to-one>表示EmpDept是多对一的关系,name="dept"表示在Emp类里面有一个属性是Dept对象dept,column="deptId"表示 它们之间是用deptId建立联系的。

下面是级联插入数据的代码:

  package com.test;

  import java.util.Date;

  import org.hibernate.Session;
  import org.hibernate.Transaction;

  import com.pojo.Dept;
  import com.pojo.Emp;
 import com.util.DBUtil;

 public class 级联插入数据 {

     /**
      * @param args
      */
     public static void main(String[] args) {
         //获得session
         Session session = DBUtil.getSession();
         //新建一个dept
         Dept dept = new Dept();
         dept.setDeptName("吃饭部");

         //新建emp
         Emp e1 = new Emp();
         e1.setEmpName("李白");
         e1.setEmpBirthday(new Date());

         Emp e2 = new Emp();
         e2.setEmpName("王维");
         e2.setEmpBirthday(new Date());

         dept.getEmps().add(e1);
         dept.getEmps().add(e2);

         Transaction tr = session.beginTransaction();
         try {
             session.save(dept);
             tr.commit();
         } catch (Exception e) {
             tr.rollback();
         }finally{
             session.close();
         }
     }

 }

先建立一个dept对象,然后建立两个emp对象,然后把这两个emp对象加入到dept对象的集合里面,然后保存dept。级联插入只要操作父表,就可以操作子表。前提是要在前面那个cascade="save-update"必须写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值