hibernate的一对多和多对一关系映射

本文详细解析了使用Hibernate ORM框架实现部门与员工关系的持久化过程,包括XML映射文件的编写、实体类的设计、配置文件的设置以及相关代码实现,通过实例展示了如何创建表、添加新部门、输出部门所有员工等操作。

//dep.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
 package="com.total">
 <class name="Dep">
  <id name="depId">
   <generator class="native"></generator>
  </id>
  <property name="depName"></property>
  <!-- 关系 -->
  
  <!--name表示部门表中有很多员工,class表示emps表示的类型,key是外键,它必须跟主表中的外键的名字一样,正是根据外键才能找到员工的  -->
  <set name="emps" cascade="save-update">
   <key column="depId"></key>
   <one-to-many class="com.total.Emp"/>
  </set>
  
 </class>
</hibernate-mapping>

//emp.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
 package="com.total">
 
 <class name="Emp" >
 
  <id name="empId">
   <generator class="native"></generator>
  </id>
  
  <property name="empName"></property>
  <many-to-one not-null="true" cascade="all" name="dep" column="depId" ></many-to-one><!--depId是外键的字段名,dep是外键的对象表示形式,cascede表示的级联,not-null表示外键不能为空  -->
   
  
 </class>
</hibernate-mapping>

 

//Dep的代码

import java.util.HashSet;
import java.util.Set;

public class Dep {
 private String depName;
 private Integer depId;
 private Set<Emp> emps = new HashSet<Emp>();
 public String getDepName() {
  return depName;
 }
 public void setDepName(String depName) {
  this.depName = depName;
 }
 public Integer getDepId() {
  return depId;
 }
 public void setDepId(Integer depId) {
  this.depId = depId;
 }
 public Set<Emp> getEmps() {
  return emps;
 }
 public void setEmps(Set<Emp> emps) {
  this.emps = emps;
 }

}
///Emp的代码

public class Emp {
 private String empName;
 private Integer empId;
 private Dep dep;
 public String getEmpName() {
  return empName;
 }
 public void setEmpName(String empName) {
  this.empName = empName;
 }
 public Integer getEmpId() {
  return empId;
 }
 public void setEmpId(Integer empId) {
  this.empId = empId;
 }
 public Dep getDep() {
  return dep;
 }
 public void setDep(Dep dep) {
  this.dep = dep;
 }

}
//这是hibernate.cfg.xml的代码

<!DOCTYPE hibernate-configuration PUBLIC
 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory name="foo">
 <property name="show_sql">true</property>
 <property name="myeclipse.connection.profile">mysql</property>
 <property name="connection.url">
  jdbc:mysql://localhost:3306/hibernate
 </property>
 <property name="connection.username">root</property>
 <property name="connection.password">caohuan</property>
 <property name="connection.driver_class">
  com.mysql.jdbc.Driver
 </property>
 <property name="dialect">
  org.hibernate.dialect.MySQLDialect
 </property>

 <property name="hibernate.hbm2ddl.auto">update</property>
 <mapping resource="com/total/Dep.hbm.xml" />
 <mapping resource="com/total/Emp.hbm.xml" />

</session-factory>
</hibernate-configuration>

//这是hibernateUtil的代码

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
 
 private static SessionFactory factory;
 private HibernateUtil(){};
 static{
  
   Configuration configuration = new Configuration().configure();
   factory = configuration.buildSessionFactory();
  }
 public static SessionFactory getSessionFactory()
 {
   return factory;
  
 }
 public static Session getSession()
 {
   return factory.openSession();
  
 }
}

//这是测试的代码

import java.util.Set;

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

public class Main {
 
 public static void main(String[] args) {
  
  Session session = HibernateUtil.getSession();
  Transaction transaction = session.beginTransaction();
  /*Dep dep = new Dep();
  dep.setDepName("a");
  Emp emp = new Emp();
  emp.setEmpName("张三");
  emp.setDep(dep);
  session.save(dep);
  session.save(emp);
  transaction.commit();
  session.close();*/
  /*Dep dep = new Dep();
  dep.setDepName("liaonanbu");
  Emp emp1 = new Emp();
  emp1.setDep(dep);
  emp1.setEmpName("李四");
  Emp emp2 = new Emp();
  emp2.setEmpName("李四");
  emp2.setDep(dep);
  session.save(dep);
  session.save(emp1);
  session.save(emp2);
  emp1.setEmpName("caohuan");//这是持久化对象,hibernate会自动进行处理(即进行更新操作)
  transaction.commit();
  session.close();*/
  //Emp emp = (Emp) session.get(Emp.class, 1);
  //System.out.println(emp.getDep().getDepName());
  /*Dep dep = (Dep) session.get(Dep.class, 1);
  Set<Emp> emps = dep.getEmps();
  for (Emp emp : emps) {
   System.out.println(emp.getEmpName());
  }*/
  Dep dep = new Dep();
  dep.setDepName("b");
  Emp emp = new Emp();
  emp.setEmpName("张三123");
  emp.setDep(dep);
  //dep.getEmps().add(emp);//部门里面增加一个员工
//  Hibernate.initialize(emp.getDep());
  session.save(emp);
  transaction.commit();
  session.close();
 }

}

//这是第二个例子

//Dept.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!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.pojos.Dept" table="dept">
       <!-- 主键 -->
       <id name="depid" column="depid">
           <generator class="native"></generator>
       </id>
      
       <!-- 其它字段 -->
       <property name="depname" column="depname"></property>
      
       <!-- 关系 key是外键名字
          cascade=delete级联删除,删除主表时,子表也删除
          cascade=save-update 级联添加
          cascade=all (级联删除和添加)
          cascade=none(默认,不级联)
      
       -->
       <set name="emps" cascade="delete,save-update">
           <key column="depid"></key>
          
           <one-to-many  class="com.pojos.Emp"/>
          
       </set>
      
   </class>
</hibernate-mapping>

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Dept implements Serializable {
 private int depid;// 部门id
 private String depname; // 部门名称
 private Set emps = new HashSet();// 多个员工

 public int getDepid() {
  return depid;
 }

 public void setDepid(int depid) {
  this.depid = depid;
 }

 public String getDepname() {
  return depname;
 }

 public void setDepname(String depname) {
  this.depname = depname;
 }

 public Set getEmps() {
  return emps;
 }

 public void setEmps(Set emps) {
  this.emps = emps;
 }

}

 

//Emp.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!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.pojos.Emp" table="emp">
      <!-- 主键策略 -->
      <id name="empid" column="empid">
         <generator class="native"></generator>
      </id>
     
      <!-- 其它字段 -->
      <property name="empname" column="empname"></property>
     
      <!-- 关系(多个员工对应一个部门)  -->
      <many-to-one name="dep" column="depid">
      </many-to-one>
     
   </class>
</hibernate-mapping>

import java.io.Serializable;

public class Emp implements Serializable {
 // 员工编号
 private int empid;
 // 员工姓名
 private String empname;
 // 所在部门
 private Dept dep;

 public int getEmpid() {
  return empid;
 }

 public void setEmpid(int empid) {
  this.empid = empid;
 }

 public String getEmpname() {
  return empname;
 }

 public void setEmpname(String empname) {
  this.empname = empname;
 }

 public Dept getDep() {
  return dep;
 }

 public void setDep(Dept dep) {
  this.dep = dep;
 }

}

 

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.sun.faces.el.FacesCompositeELResolver;
/*
 * 工具类,获取session
 */
public class HibernateSessionFactory {
 //读取总的配置文件
 static Configuration cfg = new Configuration().configure();
   
    //创建session工厂
   static SessionFactory factory  = cfg.buildSessionFactory();
   
    //创建session
    public static Session getSession(){
     return  factory.openSession();
    }
   
 
}

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class 创建表 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  Configuration cfg = new Configuration().configure();
  SchemaExport  export  = new SchemaExport(cfg);
  
  //是否显示sql,是否执行sql
  export.create(true, true);

 }

}

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

import com.pojos.Dept;

public class 添加一个新部门 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  Session session = HibernateSessionFactory.getSession();
  Dept dept = new Dept();
  dept.setDepname("了男部");

  // 开启事务
  Transaction tr = session.beginTransaction();
  try {
   session.save(dept);
   tr.commit();
  } catch (Exception e) {
   e.printStackTrace();
   tr.rollback();
  } finally {
   session.close();
  }

 }

}
import java.util.Set;

import org.hibernate.Session;

import com.pojos.Dept;
import com.pojos.Emp;

public class 输出1号部门所有员工 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  Session session = HibernateSessionFactory.getSession();
  //查找1号部门
  Dept dept = (Dept) session.get(Dept.class, 1);
  //得到这个部门所有员工
  Set<Emp> set = dept.getEmps();
  for (Emp emp : set) {
   System.out.println(emp.getEmpname());
  }
  
  
 }

}
import java.util.List;
import java.util.Set;

import org.hibernate.Query;
import org.hibernate.Session;

import com.pojos.Dept;
import com.pojos.Emp;

public class 输出1号部门所有员工二 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  Session session = HibernateSessionFactory.getSession();
  String hql = "from Emp e where e.dep=?";
  Query query = session.createQuery(hql);
  query.setParameter(0, 1);
  List<Emp> list = query.list();
  for (Emp emp : list) {
   System.out.println(emp.getEmpname());
  }
  
  
 }

}


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

import com.pojos.Dept;
import com.pojos.Emp;

public class 添加新员工方法二 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  Session session = HibernateSessionFactory.getSession();
  // 查找一号部门
  Dept dept = (Dept) session.load(Dept.class, 1);

  // 添加新员工
  Emp emp = new Emp();
  emp.setEmpname("李四");
  dept.getEmps().add(emp);

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

 }

}

 

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

import com.pojos.Dept;
import com.pojos.Emp;

public class 添加新员工方法一 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  Session session = HibernateSessionFactory.getSession();
  // 查找一号部门
  Dept dept = (Dept) session.load(Dept.class, 1);

  // 添加新员工
  Emp emp = new Emp();
  emp.setEmpname("张三");
  emp.setDep(dept); //效率高

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

 }

}

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

import com.pojos.Dept;

public class 级联删除 {

 /**
  * @param args
  *            级联:主表操作时,子表也操作 可以有:级联删除和级联添加 级联删除:删除主表,从表自动删除 级联添加:同时添加主表和从表
  *            在默认的情况,不支持级联,要修改映射文件
  *            注意:HQL不支持级联
  */
 public static void main(String[] args) {
  // 查找1号部门
  Session session = HibernateSessionFactory.getSession();
  Dept dept = (Dept) session.load(Dept.class, 1);

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

 }

}

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

import com.pojos.Dept;
import com.pojos.Emp;

public class 级联添加 {

 /**
  * @param args
  *            同时添加新部门和新员工
  */
 public static void main(String[] args) {
  Session session = HibernateSessionFactory.getSession();

  // 1.实例化新部门
  Dept dept = new Dept();
  dept.setDepname("国防部");
  // 2.实例化新员工
  Emp e1 = new Emp();
  Emp e2 = new Emp();
  e1.setEmpname("张三");
  e2.setEmpname("李四");

  // 3.把员工添加到新部门
  dept.getEmps().add(e1);
  dept.getEmps().add(e2);

  // 4.保存新部门
  Transaction tr = session.beginTransaction();
  try {
   session.save(dept);
   tr.commit();
  } catch (Exception e) {
   e.printStackTrace();
   tr.rollback();
  } finally {
   session.close();
  }

 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值