7.hibernat实现双向一对多(多对一)

时间:2023-03-09 09:57:42
7.hibernat实现双向一对多(多对一)

1.创建如下项目结构

2.在项目的src下创建hibernate.cfg.xml主配置文件

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property> <mapping resource="com/entity/Dept.hbm.xml"/>
<mapping resource="com/entity/Emp.hbm.xml"/>
</session-factory>
</hibernate-configuration>

hibernate.cfg.xml

3.在项目的src下的com.entity包下创建Dept.java

 package com.entity;

 import java.util.HashSet;
import java.util.Set; public class Dept {
/**
* 部门编号
*/
private int deptno;
/**
* 部门名称
*/
private String dname;
/**
* 部门位置
*/
private String loc;
/**
* 创建set集合
*/
private Set<Emp> empset=new HashSet<Emp>(); public Dept() {
}
public Dept(int deptno, String dname, String loc) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
} public Dept(int deptno, String dname, String loc, Set<Emp> empset) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
this.empset = empset;
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
} public Set<Emp> getEmpset() {
return empset;
}
public void setEmpset(Set<Emp> empset) {
this.empset = empset;
}
@Override
public String toString() {
return "Dept [deptno=" + deptno + ", dname=" + dname + ", empset="
+ empset + ", loc=" + loc + "]";
} }

Dept.java

4.在项目的src下的com.entity包下创建Emp.java

 package com.entity;

 import java.util.Date;

 public class Emp {
/**
* 员工编号
*/
private Integer empno;
/**
* 员工姓名
*/
private String ename;
/**
* 员工工作
*/
private String job;
/**
* 员工领导编号
*/
private Integer mgr;
/**
* 员工雇佣日期
*/
private Date hiredate;
/**
* 员工工资
*/
private Integer sal;
/**
* 员工奖金
*/
private Integer comm;
/**
* 部门外键
* 引入部门对象
*/
private Dept dept;
public Emp() {
super();
}
public Emp(Integer empno, String ename, String job, Integer mgr,
Date hiredate, Integer sal, Integer comm, Dept dept) {
this.empno = empno;
this.ename = ename;
this.job = job;
this.mgr = mgr;
this.hiredate = hiredate;
this.sal = sal;
this.comm = comm;
this.dept = dept;
} public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public Integer getMgr() {
return mgr;
}
public void setMgr(Integer mgr) {
this.mgr = mgr;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public Integer getSal() {
return sal;
}
public void setSal(Integer sal) {
this.sal = sal;
}
public Integer getComm() {
return comm;
}
public void setComm(Integer comm) {
this.comm = comm;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Emp [comm=" + comm + ", dept=" + dept + ", empno=" + empno
+ ", ename=" + ename + ", hiredate=" + hiredate + ", job="
+ job + ", mgr=" + mgr + ", sal=" + sal + "]";
} }

Emp.java

5.在项目的src下的com.entity包下创建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.entity.Dept" table="DEPT" schema="SCOTT" lazy="true">
<!-- 主键配置 -->
<id name="deptno" type="java.lang.Integer" column="DEPTNO">
<!-- 主键由应用程序负责生成 -->
<generator class="assigned"/>
</id>
<!-- 部门名称 -->
<property name="dname" type="java.lang.String" column="DNAME"/> <!-- 部门位置 -->
<property name="loc" type="java.lang.String" column="LOC"/> <!--
一对多映射
cascade级联:操作主表时同时操作从表
cascade="save-update" 级联增和该
cascade="delete" 级联删除
cascade="none" 忽略关联
cascade="all"级联增删改
-->
<!-- inverse="false"主动维护关联关系,false主动方,true被动方(当从表修改时,主表不修改)
inverse="false"两条update
inverse="true" 一条update -->
<set name="empset" cascade="all" inverse="true" order-by="ename asc">
<!-- 本表主键列,对应emp的外键列 -->
<key column="DEPTNO"></key>
<!-- 集合存储的数据类型 -->
<one-to-many class="com.entity.Emp"/>
</set>
</class>
</hibernate-mapping>

Dept.hbm.xml

6.在项目的src下的com.entity包下创建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.entity.Emp" table="EMP" schema="scott" >
<id name="empno" type="java.lang.Integer" column="EMPNO">
<generator class="assigned"/>
</id>
<property name="ename" type="java.lang.String" column="ENAME"/>
<property name="job" type="java.lang.String" column="JOB"/>
<property name="mgr" type="java.lang.Integer" column="MGR"/>
<property name="hiredate" type="java.util.Date" column="HIREDATE"/>
<property name="sal" type="java.lang.Integer" column="SAL"/>
<property name="comm" type="java.lang.Integer" column="COMM" not-null="false" /> <!-- 多对一映射:name是emp中外键字段引用的对象,class是对象的类型,column是数据库中对应的外键列字段名 -->
<many-to-one name="dept" class="com.entity.Dept" column="DEPTNO"/>
</class>
</hibernate-mapping>

Emp.hbm.xml

7.在项目的src下的com.util包下创建HibernateUtil.java

HibernateUtil.java

8.在项目的src下的com.dao包下创建EmpDao.java

 package com.dao;

 import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.logging.SimpleFormatter; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction; import com.entity.Dept;
import com.entity.Emp;
import com.util.HibernateUtil; public class DeptDao { public static void main(String[] args) {
System.out.println("--------------------1.保存:部门对象,插入2条,修改1条------------------");
//saveDept();
System.out.println("----------------2.删除部门数据级联删除员工--------------------------------------");
// deleteDept(4);
System.out.println("----------------3.修改员工--------------------------------------");
//updateEmp(2,1);
System.out.println("-------------------4.查询某部门下的所有员工,并按姓名排序order-by-------------------------------------");
//getEmpByDeptno(10);
System.out.println("-------------------5.查询某部门信息--lazy=false-----------------------------------");
//getDeptByDeptno(10);
System.out.println("-------------------6.查询某部门信息--lazy=true-----------------------------------");
saveEmp(10); }
/**
* -6.查询某部门信息--lazy=true懒加载 ,查的时候用load懒加载查询的方式
* @param id
*/
private static void saveEmp(int id) {
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction(); //查单条load懒加载
Dept dept=(Dept) session.load(Dept.class, id);
Date date=null;
try {
date = new SimpleDateFormat("yyyy-MM-dd").parse("2013-3-3");
} catch (ParseException e) {
e.printStackTrace();
}
Emp emp=new Emp(6, "holly", "教员", 2, date, 2300, 200, dept); //添加员工信息
session.save(emp);
tx.commit();
System.out.println("添加成功"); HibernateUtil.closeSession(); }
/**
* 5.查询某部门信息
* dept类级别的lazy=false 立即加载 ,查的时候用get立即加载的方式
* 1条查询sql
* @param i
*/
private static void getDeptByDeptno(int id) {
Session session=HibernateUtil.getSession(); //查单条
Dept dept=(Dept) session.load(Dept.class, id); HibernateUtil.closeSession(); }
/**
* 4.查询某部门下的所有员工,并按姓名排序order-by
* @param i
*/
private static void getEmpByDeptno(int id) {
Session session=HibernateUtil.getSession(); //查单条
Dept dept=(Dept) session.get(Dept.class, id);
Set<Emp> emps=dept.getEmpset();
for (Emp emp : emps) {
System.out.println(emp.getEname());
}
HibernateUtil.closeSession(); }
/**
* 3.修改员工
* @param empno
* @param deptno
*/
private static void updateEmp(int empno,int deptno) {
Session session=HibernateUtil.getSession();
//2.开启事务
Transaction tx=session.beginTransaction();
//查单条
Dept dept=(Dept) session.load(Dept.class, deptno);
Emp emp=(Emp) session.load(Emp.class, empno);
/*
* 监测到Emp对象的属性发生变化,所以执行
* update
scott.EMP
set
ENAME=?,
JOB=?,
MGR=?,
HIREDATE=?,
SAL=?,
COMM=?,
DEPTNO=?
where
EMPNO=?
*/
emp.setDept(dept);
/*(inverse=false)主动,监测到Dept对象的属性发生变化,所以执行
update
scott.EMP
set
DEPTNO=?
where
EMPNO=?
(inverse=true)被动,没有上面一条update
*/
dept.getEmpset().add(emp);
System.out.println("修改成功"); tx.commit();
HibernateUtil.closeSession(); } /**
* 2.删除
* @param id
*/
private static void deleteDept(int id) {
Session session=HibernateUtil.getSession();
//2.开启事务
Transaction tx=session.beginTransaction();
//查单条
Dept dept=(Dept) session.get(Dept.class, id);
if(dept!=null){
session.delete(dept);
System.out.println("删除成功");
}else{
System.out.println("该条数据不存在");
}
tx.commit();
HibernateUtil.closeSession(); } /**
* 1.保存:1部门和2员工-----3条sql
*/
private static void saveDept() {
//1.开启Session
Session session=HibernateUtil.getSession(); //2.开启事务
Transaction tx=session.beginTransaction(); //3.执行操作
//创建部门对象
Dept dept=new Dept(3, "教职部", "安德门");
Date date=null;
try {
date = new SimpleDateFormat("yyyy-MM-dd").parse("2013-3-3");
} catch (ParseException e) {
e.printStackTrace();
} //创建员工对象
Emp emp1=new Emp(4, "holly", "教员", 2, date, 2300, 200, dept); //向集合总添加员工信息(1条sql)
dept.getEmpset().add(emp1); //保存Dept对象(2条插入)
session.save(dept); //4.提交事务
tx.commit();
System.out.println("Emp保存成功"); //5.关闭Session
HibernateUtil.closeSession();
} }

DeptDao.java

9.结果自己验证...