Hibernate关联映射(一对多双向关联)

实现:配置Dept(部门)Emp(员工)的一对多关联
操作:增加部门同时增加部门下的员工、查看部门下所有员工姓名


1、Dept类:省略getter、setter、构造方法

public class Dept implements java.io.Serializable {

	// Fields

	private Integer deptNo;
	private String deptName;
	private String location;
	private Set emps = new HashSet(0);
}


2、Emp类:省略getter、setter、构造方法

public class Emp implements java.io.Serializable {

	// Fi
	private Integer empNo;
	private Dept dept;
	private String empName;
	private String job;
	private Date hireDate;
	private Double salary;

3、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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="cn.hibernate.entity.Dept" table="dept" catalog="ssh">
        <id name="deptNo" type="java.lang.Integer">
            <column name="deptNo" />
            <generator class="identity" />
        </id>
        <property name="deptName" type="java.lang.String">
            <column name="deptName" length="50" />
        </property>
        <property name="location" type="java.lang.String">
            <column name="location" length="50" />
        </property>
        <set name="emps" inverse="true" cascade="save-update" lazy="true">
            <key>
                <column name="deptNo" />
            </key>
            <one-to-many class="cn.hibernate.entity.Emp" />
        </set>
    </class>
</hibernate-mapping>

4、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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="cn.hibernate.entity.Emp" table="emp" catalog="ssh">
        <id name="empNo" type="java.lang.Integer">
            <column name="empNo" />
            <generator class="identity" />
        </id>
        <many-to-one name="dept" class="cn.hibernate.entity.Dept" fetch="select" cascade="save-update">
            <column name="deptNo" />
        </many-to-one>
        <property name="empName" type="java.lang.String">
            <column name="empName" length="50" />
        </property>
        <property name="job" type="java.lang.String">
            <column name="job" length="50" />
        </property>
        <property name="hireDate" type="java.util.Date">
            <column name="hireDate" length="10" />
        </property>
        <property name="salary" type="java.lang.Double">
            <column name="salary" precision="22" scale="0" />
        </property>
    </class>
</hibernate-mapping>

5、DeptDao类:

package cn.hibernate.dao;

import cn.hibernate.entity.Dept;


public class DeptDao extends BaseDaoImpl<Dept>{

	@Override
	public Dept get(int id) {
		// TODO Auto-generated method stub
		return super.get(id);
	}

	@Override
	public Dept load(int id) {
		// TODO Auto-generated method stub
		return super.load(id);
	}

	@Override
	public void save(Dept entity) {
		// TODO Auto-generated method stub
		super.save(entity);
	}

	@Override
	public void update(Dept entity) {
		// TODO Auto-generated method stub
		super.update(entity);
	}

	@Override
	public void delete(Dept entity) {
		// TODO Auto-generated method stub
		super.delete(entity);
	}

	public List<Dept> findByDept(){
		String hql="from Dept";
		Query query=currentSession().createQuery(hql);
		List<Dept> list = query.list();
		for(Dept dept : list) {
			System.out.println("部门名称:"+dept.getDeptName());
			Set<Emp> emps = dept.getEmps();
			for(Emp emp : emps) {
				System.out.println("员工姓名:"+emp.getEmpName());
			}
		}
		return list;
	}
}

6、DeptService类:

package cn.hibernate.service;

import org.hibernate.HibernateException;
import org.hibernate.Transaction;
import cn.hibernate.dao.DeptDao;
import cn.hibernate.entity.Dept;

public class DeptService {
	
	private DeptDao deptdao = new DeptDao();

	public DeptDao getDeptdao() {
		return deptdao;
	}

	public void setDeptdao(DeptDao deptdao) {
		this.deptdao = deptdao;
	}
	
	//级联增加部门和员工
	public void addDeptAndEmps(Dept dept) {
		Transaction tx=null;
		try {
			//开启事务
			tx=deptdao.currentSession().beginTransaction();
			//执行操作
			deptdao.save(dept);
			//提交事务
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			if(tx!=null){
				tx.rollback();
			}
		}
	}
	
	
	//查询各个部门的员工姓名
	public List<Dept> findEmps() {
		Transaction tx = null;
		List<Dept> list = new ArrayList<Dept>();
		try {
			//开启事务
			tx = deptdao.currentSession().beginTransaction();
			//执行操作
			list = deptdao.findByDept();
			//提交事务
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		return list;
	}
	
	
}

1、DeptServiceTest:Junit单元测试

package test;

import static org.junit.Assert.*;
import java.util.Date;
import org.junit.Test;
import cn.hibernate.entity.Dept;
import cn.hibernate.entity.Emp;
import cn.hibernate.service.DeptService;

public class DeptServiceTest {

	private DeptService deptservice = new DeptService();
	
	public DeptService getDeptservice() {
		return deptservice;
	}

	public void setDeptservice(DeptService deptservice) {
		this.deptservice = deptservice;
	}

	@Test
	public void testAddDeptAndEmps() {
		
		//创建部门对象
		Dept dept = new Dept();
		dept.setDeptName("技术部");
		dept.setLocation("八楼");
		
		//创建员工对象
		Emp emp1 = new Emp();
		emp1.setEmpName("小明");
		emp1.setJob("java");
		emp1.setSalary(12000.0);
		emp1.setHireDate(new Date());
		
		Emp emp2 = new Emp();
		emp2.setEmpName("娜娜");
		emp2.setJob("UI");
		emp2.setSalary(8000.0);
		emp2.setHireDate(new Date());
		
		Emp emp3 = new Emp();
		emp3.setEmpName("洁儿");
		emp3.setJob("UI");
		emp3.setSalary(8000.0);
		emp3.setHireDate(new Date());
		
		//建立部门对象和员工对象的关联关系
		emp1.setDept(dept);
		emp2.setDept(dept);
		emp3.setDept(dept);
		
		dept.getEmps().add(emp1);
		dept.getEmps().add(emp2);
		dept.getEmps().add(emp3);
		
		deptservice.addDeptAndEmps(dept);
	}

	@Test
	public void testFindEmps() {
		System.out.println("测试开始");
		deptservice.findEmps();
	}
}

cascade属性:




inverse属性:






lazy属性:






总结:

OpenSessionInView:



package cn.hibernate.web;

import java.io.IOException;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.hibernate.HibernateException;
import org.hibernate.Transaction;

import cn.hibernate.util.HibernateUtil;



public class OpenSessionInView implements Filter{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		// TODO Auto-generated method stub
		Transaction tx=null;
		try {
			//请求到达时,打开Session并启动事务
			tx=HibernateUtil.currentSession().beginTransaction();
			//执行请求处理链
			arg2.doFilter(arg0, arg1);
			//返回响应时,提交事务
			tx.commit();
		} catch (HibernateException e) {
			// TODO: handle exception
			e.printStackTrace();
			if(tx!=null){
				tx.rollback();
			}
		}
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

在web.xml上配置该过滤器

  <filter>
  	<filter-name>OpenSessionInView</filter-name>
  	<filter-class>cn.hibernate.web.OpenSessionInView</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>OpenSessionInView</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值