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 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类 ...
随机推荐
- 【转】Android仿QQ截图应用测试
使用过QQ的同学应该都用过QQ截图,Ctrl+Alt+A进入截图操作,通过拉伸,移动高亮区域的框体可以快速截取我们需要的图片.在android应用中,我们也经常需要截图操作,以下实现了一个类似QQ截图 ...
- JavaScript中childNodes、children、nodeValue、nodeType、parentNode、nextSibling详细讲解
其中属性.元素(标签).文本都属于节点 <title></title> <scripttype="text/javascript"> windo ...
- 指向函数的指针 分类: C/C++ 2015-07-13 11:03 14人阅读 评论(0) 收藏
原文网址:http://www.cnblogs.com/zxl2431/archive/2011/03/25/1995285.html 讲的很清楚,备份记录. (一) 用函数指针变量调用函数 可以用指 ...
- 标准库function类型的使用
14.44编写一个简单的桌面计算器使其能处理二元运算. #include<iostream> #include<map> #include<functional> ...
- System Operations on AWS - Lab 2 - Configuring VPC
建立包含Public和Private子网的VPC,建立Internet Gateway,建立Public和Private子网的路由表,创建NAT和Bastion EC2实例 1. 配置你的私有虚拟云 ...
- JQuery字符串替换replace方法
在日常的js开发中,常常会用到JQuery, 当要把字符串中的内容替换时,如果使用类似C#的string.replace方法,如下 var str='aabbccaa'; str=str.replac ...
- Modem常用概念
真实设备的标识,即DEVICE_ID.比如,Android设备是手机,这个DEVICE_ID可以同通过TelephonyManager.getDeviceId()获取,它根据不同的手机设备返回IMEI ...
- Task类(任务)
任务表示应完成的某个单元的工作.这个单元的工作可以在单独的线程中运行,也可以以同步方式启动一个任务,这需要等待主调用线程.使用任务不仅可以获得一个抽象层,还可以对底层线程进行很多控制. 1.启动任务 ...
- Oracle存储过程中不支持DML语言的解决方法(针对遇见的DROP关键字)
---存储过程中的原语句: ---删除表 DROP TABLE A_NEWTDDATA; --报错 经查询:存储过程不支持DML语言: 解决方法: execute immediate 'DROP TA ...
- 【php】中【event】之实现方式
这两天看了点事件机制,那么在php中,如何实现最简单的事件呢? 废话不多说,我们上代码. <?php class Event{ //事件名称 public $name; //存储hander p ...