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 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类 ...
随机推荐
- 关于64位Linux配置android开发环境出现 No such file or directory
前几天在64位系统上部署android开发环境的时候出现了这种问题 /aapt: No such file or directory 通过谷老师,知道原理android SDK里面的程序全是32位的, ...
- HDOJ--4786--Fibonacci Tree【生成树】
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:给出n个点,m条边,和边的信息. 边有两种颜色,白色和黑色.现要求构造一个生成树.看是否能满足 ...
- 怎样在win7下装ubuntu(硬盘版安装)
1)首先还是分区,在计算机上右键--管理--磁盘管理 装Ubuntu分配的硬盘大小最好是(20G以上)不要太小,这里请注意,ubuntu和windows文件系统全然不同,所以我们划好要给ubuntu的 ...
- 动态规划入门——Eddy's research II
转载请注明出处:http://blog.csdn.net/a1dark 分析:找规律 #include<stdio.h> int main(){ int m,n; while(scanf( ...
- StirngUtil工具类 之 邮箱注冊 域名不区分大写和小写方法
/** * 传入邮箱域名所有变为小写,然后拼接前缀返回 *<b>Summary: </b> * emailDomainTransform() * @param domain * ...
- docker build lnmp(未完成。。。)
docker pull centos # 拉取镜像到本地 docker run -i -t -p 8000:80 --name=centosDev centos cat /etc/redhat-rel ...
- Bootstrap 开关(switch)控件需要注意的问题
远程文档地址:http://www.bootcss.com/p/bootstrap-switch/ 先上lz遇到的小坑:自古无图无真相的原则 上面代码注释掉后 就是下面这个图片效果!然后加载顺序也要注 ...
- Java-Android 之应用停止错误
在Android在手机上运行的时候: 经常会出现应用程序停止: 一: 因为触发的方法里面没有传值View 对象,方法报错
- jsp中的注释
jsp中有各种针对不同类型语言的注释,值得注意的是对于标签 <jsp:include/>是需要使用jsp注释"<%----%>", (不能是<!-- ...
- Ubuntu Server下建立VPN服务器 pptp 模式的方法
对于想要在外部访问内部的网络,除了在防火墙上开启相应服务器所对应的端口,最好的方法应该是建立VPN-Server,使得用户可以在外网任何一台计算机上拨入到内网中进行操作,而且VPN可以记录详细的日志, ...