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 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类 ...
随机推荐
- 【转】YUV420P的格式以及转换为RGB565的代码(Android摄像头的输出一般为YUV420P)
http://blog.csdn.net/daisyhd/article/details/38866809 static void cvt_420p_to_rgb565(int width, int ...
- 【转】Android Camera(五)使用Camera功能 AREA的理解
http://blog.csdn.net/think_soft/article/details/7998478 使用Camera功能 大多数的Camera功能都是使用Camera.Parameters ...
- 读书笔记-HBase in Action-第二部分Advanced concepts-(1)HBase table design
本章以山寨版Twitter为例介绍HBase Schema设计模式.广义的HBase Schema设计不仅仅包含创建表时指定项,还应该综合考虑Column families/Column qualif ...
- 用CSS border相关属性画三角形
效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2l3aV9jb2Rlcg==/font/5a6L5L2T/fontsize/400/fill/I0J ...
- TCP keepalive
2. TCP keepalive overview In order to understand what TCP keepalive (which we will just call keepa ...
- \n 与 \r
符号 ASCII码 意义 \n 换行NL \r 回车CR 回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return 换行 \n 本义是光标往 ...
- 基于事件的 NIO 多线程服务器--转载
JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程开销的问题,在 NIO 中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务线程,而是通过多线程充分使用用多个 CPU 的处 ...
- linux下配置php Apache mysql
一 Apache部分 http://www.cnblogs.com/bluewelkin/p/3805107.html里面是纠正了原文的一些小错误,即可正常安装 1.su 命令2.安装apr-1.3. ...
- linux中的网络通信指令 分类: 学习笔记 linux ubuntu 2015-07-06 16:02 134人阅读 评论(0) 收藏
1.write write命令通信是一对一的通信,即两个人之间的通信,如上图. 效果图 用法:write <用户名> 2.wall wall指令可将信息发送给每位同意接收公众信息的终端机用 ...
- Java基础知识强化之集合框架笔记53:Map集合之Map集合的遍历 键值对对象找键和值
1. Map集合的遍历(键值对对象找键和值) Map -- 夫妻对 思路: A: 获取所有结婚证的集合 B: 遍历结婚证的集合,得到每一个结婚证 C: 根据结婚证获取丈夫和妻子 转换: A: ...