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 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类 ...
随机推荐
- 绿色tftpserver:tftpd32的配置
嵌入式开发中少不了用到TFTP服务,它的功能主要是用来给目标板传输文件. tftpd32.exe是如今最经常使用的TFTPserver,今天就来介绍它的配置方法. 1.从这里 下载新版本号tftpd3 ...
- java连接oracle的简单实例
连接oracle的时候,要导入oracle驱动的jar包. 连接的时候,有statement和preparedstatement两种,从代码中可以看出不同. example: package com. ...
- 打造强势智能手表平台:Testin云測携手索尼招募全球开发人员
打造强势智能手表平台:Testin云測携手索尼招募全球开发人员 2014/10/27 · Testin · 业界资讯 日前,全球最大的移动游戏.应用真机和用户云測试平台Testin云測宣布联手索尼公司 ...
- 基于事件的 NIO 多线程服务器--转载
JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程开销的问题,在 NIO 中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务线程,而是通过多线程充分使用用多个 CPU 的处 ...
- oracle口令管理之允许某个用户最多尝试三次登录
如果一个用户连续三次登录失败,则锁定该用户两天,两天之后该用户才能重新登录. 创建profile文件: 更新账户: 三次登录失败后用户就会被锁定: 用户锁住之后要怎么给他解锁: 解锁之后就可以正常登录 ...
- sybase SA密码重置
sa 密码忘记解决之道: su - sybase cd ASE/install vi RUN_etoh2 在文件的末尾加入 -psa \ 停止原数据库服务 由于密码遗忘,所以只能通过kill进程停止服 ...
- RedHat7搭建PHP开发环境(Zend Studio)
下载Zend Studio # wget http://downloads.zend.com/studio-eclipse/13.0.1/ZendStudio-13.0.1-linux.gtk.x86 ...
- 在VS中关于MySQL的相关问题
最近在vs上折腾mysql数据库 遇到了一些小问题,这里记录一下 问题一:数据源选择中没有mysql数据库的选项 解放方法: 1.安装MySql的VS插件(版本请下载最新版)mysql-for-vis ...
- 监听EditText的变化
http://liangruijun.blog.51cto.com/3061169/729505 之前博客上的有关EditText的文章,只是介绍EditText的一些最基本的用法,这次来深入学习一下 ...
- Android MVP模式的初识
MVP是什么?或许在之前更多的人知道的是MVC这个模式(Model View Controller),然而MVP与MVC最不同的一点是M与V是不直接 关联的也是就Model与View不存在直接关系 ...