Hibernate中的一对多关系详解(2)
一对多的关系:例如,部门对员工,一个部门可以有多个员工
多对一的关系:例如,员工对部门,多个员工属于一个部门,并且每个员工只能属于一个部门
那么一对多、多对一在数据库中的是怎样表示的呢?好多话都不说了,请看下面例子:
public class DeptVo implements Serializable {
private int deptno;
private String dname;
private String loc;
//每个部门中存放的员工 用于一对多
private Set<EmpVo> employees = new HashSet<EmpVo>();
....get ,set 方法已省略
}
public class EmpVo implements Serializable {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private Date hiredate;
private Float sal;
private Float comm;
private Integer deptno;
private DeptVo dept=new DeptVo();//存放部门对象,用于多对一
....
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ysq.vo">
<class name="DeptVo" table="dept">
<id name="deptno">
<generator class="sequence">
<param name="sequence">dept_seq</param>
</generator>
</id>
<property name="dname"/>
<property name="loc"/> <!-- 部门对员工的一对多配置-->
<set name="employees" inverse="true" cascade="all" lazy="false"><!--inverse="true"让对方维护双方的关系,cascade="all"级联操纵-->
<key column="deptno"></key><!--column="deptno"指定员工表的外键-->
<one-to-many class="EmpVo"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ysq.vo">
<class name="EmpVo" table="emp">
<id name="empno">
<generator class="sequence">
<param name="sequence">dept_seq</param>
</generator>
</id>
<property name="ename"/>
<property name="job"/>
<property name="mgr"/>
<property name="hiredate" type="java.sql.Date"/>
<property name="sal"/>
<property name="comm"/>
<!-- 员工对部门的多对一配置 column指定外键-->
<many-to-one name="dept" class="DeptVo" column="deptno"></many-to-one> </class>
</hibernate-mapping>
public class one_to_many_Test {
/**
* 级联添加部门,同时添加对应部门的员工
*/
@Test
public void addDeptment(){
DeptVo dept=new DeptVo();
dept.setDname("人事部");
dept.setLoc("5#");
EmpVo emp1=new EmpVo();
emp1.setEname("张三");
emp1.setJob("码农员");
EmpVo emp2=new EmpVo();
emp2.setEname("张三2");
emp2.setJob("主管");
//为员工设置部门
emp1.setDept(dept);
emp2.setDept(dept);
//为部门添加员工
dept.getEmployees().add(emp1);
dept.getEmployees().add(emp2);
Session session = SessionFactoryUtils.getSession();
Transaction tr = session.beginTransaction();
try {
tr.begin();
session.save(dept);//保存部门时,级联保存了部门中的员工
tr.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
}
/**
* 级联删除部门时,删除对应部门中的员工
*/
@Test
public void deleteDeptment(){
Session session = SessionFactoryUtils.getSession();
DeptVo deptment=(DeptVo)session.get(DeptVo.class, 15);
//获取部门中的员工
/*Set<EmpVo> emps=deptment.getEmployees();
deptment.setEmployees(emps);*/
Transaction tr = session.beginTransaction();
try {
tr.begin();
session.delete(deptment);//删除部门时,级联删除了部门中的员工
tr.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
}
/**
* 级联修改部门,同时修改对应部门的员工
*/
@Test
public void updateDeptment(){
Session session = SessionFactoryUtils.getSession();
Transaction tr = session.beginTransaction();
//获取要修改部门信息的部门
DeptVo dept=(DeptVo)session.get(DeptVo.class, 5);
//获取该部门下的某一员工信息,如empno为6的员工
EmpVo emp =(EmpVo)session.get(EmpVo.class, 6);
tr.commit();
dept.getEmployees().add(emp);//获取部门中的员工,同时将要修改的员工的加进去
session.close();
try {
//重新获得session并重新启动事务
session=SessionFactoryUtils.getSession();
tr = session.beginTransaction();
tr.begin();
//修改部门信息
dept.setLoc("4#");
//修改员工信息
emp.setEname("无线11");
//设置双向关联
// ept.getEmployees()d.add(emp);此句是获取不到部门中的员工的,原因是不在同一个session中,可以用下面的方法
/*Set emps = new HashSet();
emps.add(emp);
dept.setEmployees(emps);*/
emp.setDept(dept);
session.update(dept);
tr.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
}
/**
* 查询部门时,同时查询部门的员工
* 方法一:使用立即加载 在一的配置文件中增加lazy=flase;注意:一对多默认的是延迟加载,即lazy=true
*/
@Test
public void selectTest1(){
Session session = SessionFactoryUtils.getSession();
Transaction tr = session.beginTransaction();
DeptVo depts=(DeptVo)session.get(DeptVo.class, 18);//查询部门id为18的
tr.commit();
session.close();
//获取部门下的员工
Set<EmpVo> emp= depts.getEmployees();
System.out.println(depts.getDname()+"-----"+emp.size());
}
/**
* 查询部门时,同时查询部门的员工
* 方法二:使用join fetch加载员工 ,不需要在一的方增加lazy=false;
*/
@Test
public void selectTest2(){
Session session = SessionFactoryUtils.getSession();
Transaction tr = session.beginTransaction();
Query q = session.createQuery("from DeptVo d join fetch d.employees where d.deptno=?");//创建一个查询对象
q.setInteger(0, 6);
DeptVo dept = (DeptVo)q.uniqueResult();
tr.commit();
session.close();
System.out.println("部门名称:"+dept.getDname());
Set emps = dept.getEmployees();
for (Iterator iter = emps.iterator(); iter.hasNext();) {
EmpVo emp = (EmpVo) iter.next();
System.out.println("员工名字:"+emp.getEname());
}
}
/**
* 查询所有的部门,同时查询所有的员工
*/
@Test
public void selectAll(){
Session session=SessionFactoryUtils.getSession();
List<DeptVo> list = session.createQuery("from DeptVo").list();
session.close();
for (DeptVo deptVo : list) {
Set<EmpVo> emps=deptVo.getEmployees();
System.out.println(deptVo.getDname()+"_-----------dept");
if(emps.size()>0){
for (EmpVo empVo : emps) {
System.out.println(empVo.getEname()+"-----emp---");
}
}
}
}
}
Hibernate中的一对多关系详解(2)的更多相关文章
- Hibernate中的多对多关系详解(3)
前面两节我们讲到了一对一的关系,一对多,多对一的关系,相对来说,是比较简单的,但有时,我们也会遇到多对多的关系,比如说:角色与权限的关系,就是典型的多对多的关系,因此,我有必要对这种关系详解,以便大家 ...
- laravel中的多对多关系详解
数据表之间是纵横交叉.相互关联的,laravel的一对一,一对多比较好理解,官网介绍滴很详细了,在此我就不赘述啦,重点我记下多对多的关系 一种常见的关联关系是多对多,即表A的某条记录通过中间表C与表B ...
- Qt中QGraphics类坐标映射关系详解
1.Item(图元)坐标:属于局部坐标,通常以图元中心为原点(中心对称),非中心对称类,比如dialog类,一般以左上角为原点,正方向x朝右,y朝下. 2.setPos的坐标是父类坐标系的坐标,一般对 ...
- hibernate集合映射inverse和cascade详解
hibernate集合映射inverse和cascade详解 1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或 ...
- [ 转载 ] Java开发中的23种设计模式详解(转)
Java开发中的23种设计模式详解(转) 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...
- slf4j log4j logback关系详解和相关用法
slf4j log4j logback关系详解和相关用法 写java也有一段时间了,一直都有用slf4j log4j输出日志的习惯.但是始终都是抱着"拿来主义"的态度,复制粘贴下配 ...
- 【转】UML类图与类的关系详解
UML类图与类的关系详解 2011-04-21 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(D ...
- C#中的Linq to Xml详解
这篇文章主要介绍了C#中的Linq to Xml详解,本文给出转换步骤以及大量实例,讲解了生成xml.查询并修改xml.监听xml事件.处理xml流等内容,需要的朋友可以参考下 一.生成Xml 为了能 ...
- UML类图与类的关系详解
摘自:http://www.uml.org.cn/oobject/201104212.asp UML类图与类的关系详解 2011-04-21 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类 ...
随机推荐
- 最简单的基于FFMPEG的封装格式转换器(无编解码)
本文介绍一个基于FFMPEG的封装格式转换器.所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(相应.avi,.flv,.mkv,.mp4文件).须要注意的是,本程序并不进行视 ...
- UVA10518 - How Many Calls?(矩阵高速幂)
UVA10518 - How Many Calls?(矩阵高速幂) 题目链接 题目大意:给你fibonacci数列怎么求的.然后问你求f(n) = f(n - 1) + f(n - 2)须要多少次调用 ...
- xshell十大技巧
xshell是我用过的最好用的ssh客户端工具,没有之一.这个软件完全免费,简单易用,可以满足通过ssh管理linux vps所有需要,唯一遗憾的是没有官方中文版. 警告:不要下载所谓的汉化版,可能有 ...
- Windows 下多线程编程技术
(1) 线程的创建:(主要以下2种) CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID lParam, int nPrio ...
- use_virtual_func_without_pointer_left
#include <oistream> using namespace std; class A { public: void foo() { func(); } virtual void ...
- angularjs-yeoman环境配置
yum install npm -y npm install -g grunt-cli bower yo generator-karma-require generator-angular-requi ...
- java Date日期去掉时分秒
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String s = sdf.format(new Date() ...
- C#中的static静态变量的用法
静态全局变量 定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量. 特点: A.该变量在全局数据区分配内存. B.初始化:如果不显式初始化,那么将被隐式初始化为0. 静 ...
- hao123 百度品专 按品类 计算 下单数量 商品数量 下单金额?
SELECT * FROM t_tag_source WHERE s_name='hao123'; +--------+----------+---------+--------+-------- ...
- 总结如何实现Android浮动层,主要是dialog的使用
自定义一个类继承自Dialog类,然后在构造方法中,定义这个dialog的布局和一些初始化信息. 查看源码打印? 01 public class MenuDialog extends Dialog { ...