实现:配置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属性:
![](https://i-blog.csdnimg.cn/blog_migrate/9337b04188adc18049af31a5880f3349.png)
inverse属性:
lazy属性:
总结:
![](https://i-blog.csdnimg.cn/blog_migrate/3dbe48ced881244778a657e00a566e98.png)
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>