Hibernate双向一对多关联关系

实例:Emp(员工)、Dept(部门)

pojo:Emp

	private Dept dept;//部门(多对一)
pojo:Dept

	private Set<Emp> emps=new HashSet<Emp>();//部门员工集合(一对多)
Emp.hbm.xml:

<!-- <property name="deptNo" type="java.lang.Byte" column="`DEPTNO`"></property> -->
		<!-- Emp类到Dept类的单向多对一映射,多个员工对应一个部门 -->
		<!-- name:设定持久化类的属性名,此处为Emp的dept属性 -->
		<!-- column:设定持久化类的属性对应的表的外键,此处为EMP表的外键DEPTNO -->
		<!-- class:设定持久化类的属性的类型,此处设定dept属性的类型为Dept -->
		<many-to-one name="dept" class="cn.hibernate.pojo.Dept" column="`DEPTNO`"/>

Dept.hbm.xml:

<!-- name设定持久化类的属性名,此处为Dept类的emps属性 -->
		<!-- column设定与所关联的持久化类相对应的表的外键,此处为EMP表的DEPTNO字段 -->
		<!-- one-to-many表示emps集合中存放的是一组Emp对象 -->
		<!-- key子元素表示EMP表通过外键DEPTNO参照DEPT表 -->
		<!-- cascade(级联) save-update表示当通过Session的save()、update()、saveOrUpdate()保存或更新当前对象的时候,级联保存所有关联的瞬时状态的对象,并且级联更新所有关联的游离状态的对象  -->
		<!-- cascade(级联) delete表示当通过Session的delete()删除当前对象的时候会级联删除所有关联的对象  -->
		<!-- cascade(级联) all表示包含save-update、delete的行为  -->
		<set name="emps" cascade="all">
			<key column="`DEPTNO`"></key>
			<one-to-many class="cn.hibernate.pojo.Emp"/>
		</set>

EmpDao:

public void save(Emp emp){
		currentSession().save(emp);
	}
	
	public List<Emp> findByDept(Dept dept){
		return currentSession().createQuery("from Emp where dept=?").setParameter(0, dept).list();
	}
	
	public List<Emp> findAll(){
		return currentSession().createQuery("from Emp").list();
	}
DeptDao:

	public void save(Dept dept) {
		currentSession().save(dept);// 保存指定的dept对象
	}

	public void delete(Dept dept) {
		currentSession().delete(dept);// 删除指定的dept对象
	}

EmpService:

public void addEmp(Emp emp){
		Transaction tx=null;
		try {
			tx=empDao.currentSession().beginTransaction();
			empDao.save(emp);
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			if(tx!=null){
				tx.rollback();
			}
		}
	}
	
	public List<Emp> findEmpsByDept(Dept dept){
		Transaction tx=null;
		List<Emp> empList=null;
		try {
			tx=empDao.currentSession().beginTransaction();
			empList=empDao.findByDept(dept);
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			if(tx!=null){
				tx.rollback();
			}
		}
		return empList;
	}
	
	public List<Emp> findAllEmps(){
		Transaction tx=null;
		List<Emp> empList=null;
		try {
			tx=empDao.currentSession().beginTransaction();
			empList=empDao.findAll();
			for (Emp emp : empList) {
				System.out.println("员工姓名:"+emp.geteName());
				System.out.println("所在部门:"+emp.getDept().getdName());
			}
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			if(tx!=null){
				tx.rollback();
			}
		}
		return empList;
	}

DeptService:

	public void addNewDept(Dept dept){
		Transaction tx=null;
		try {
			tx=HibernateUtil.currentSession().beginTransaction();//开启事务
			deptDao.save(dept);//调用DAO方法,保存dept对象的数据
			tx.commit();//提交事务
		} catch (HibernateException e) {
			if(tx!=null){
				tx.rollback();//回滚事务
			}
			e.printStackTrace();
		}
	}
	
	public void deleteDept(Byte id){
		Transaction tx=null;
		try {
			tx=HibernateUtil.currentSession().beginTransaction();//开启事务
			deptDao.delete(deptDao.get(id));//调用DAO的删除方法(参数为加载的对象)
			tx.commit();//提交事务
		} catch (HibernateException e) {
			if(tx!=null){
				tx.rollback();//回滚事务
			}
			e.printStackTrace();
		}
	}

Test:

		/*Emp emp=new Emp();
		emp.setEmpNo(12);
		emp.seteName("周永强");
		Dept dept=new Dept();
		dept.setDeptNo((byte)30);
		emp.setDept(dept);
		new EmpService().addEmp(emp);*/
		
		
		/*Dept dept=new Dept();
		dept.setDeptNo((byte)30);
		List<Emp> empList=new EmpService().findEmpsByDept(dept);
		for (Emp emp : empList) {
			System.out.println(emp.geteName());
		}*/
		
		
		/*new EmpService().findAllEmps();*/
		
		
	/*	Dept dept=new Dept((byte) 6, "生化部");
		Emp emp=new Emp();
		emp.setEmpNo(13);
		emp.seteName("剑圣");
		emp.setDept(dept);
		dept.getEmps().add(emp);
		new DeptService().addNewDept(dept);*/
		
		new DeptService().deleteDept((byte) 6);





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值