Hibernate级联及控制反转的增删改查
在JavaHibernate中,双向多对一的操作一直是一个重点难点,本篇文章就是来探讨这个问题。
双向多对一:一个班级对应多个学生,多个学生同属于一个班级,通过班级信息可以查到班级内的学生,通过学生可以查到学生所在班级。(单向则有一方不能通过己方查到对方信息)
重点难点:
1.inversr属性:反转。值:true false 。当其值在<One>方为TRUE指的是将维护关系的控制权交给多方,程序中我们一般把维护关系的权限交给多方。反之,控制权在一方。因为当多方值过多时,一方维护成本较大,导致程序卡顿。(如:全国人民记住习大大的名字很容易,让习大大记住全国每一个人民的名字就很困难)
<set name="emps" inverse="true" cascade="all" >
<key>
<column name="DEPTNO" precision="2" scale="0" />
</key>
<one-to-many class="com.sessionfactory.Emp" />
</set>
2.cascade属性:级联操作。当表中的数据改变时,关联表中的数据也随之改变。cascade有四个值。
none -- 不级联。操作互不影响
delete -- 删除级联
save-update 增加或更新数据时级联
all -- 所有对单表的操作,关联表数据也会随之改变
下面就用Oracle中Scott用户的Emp和Dept表举例
当我们不采用级联操作添加员工时
Emp emp = new Emp();
emp.setEname("prople001");
session.save(emp);
数据库中数据:EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7935 prople001
只添加了一个员工,这个员工是没有部门的。删除等操作同理,只会修改操作表的数据。
现在将Inverse属性设置为false,有一方维护关系,再添加员工
Dept dept = new Dept();
dept.setDname("国防部");
Emp emp1 = new Emp();
emp1.setEname("prople001");
Emp emp2 = new Emp();
emp2.setEname("pro2");
//级联操作
dept.getEmps().add(emp1);
dept.getEmps().add(emp2);
session.saveOrUpdate(dept);
Hibernate: insert into SCOTT.DEPT (DNAME, LOC, DEPTNO) values (?, ?, ?)
Hibernate: insert into SCOTT.EMP (DEPTNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, EMPNO) values (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into SCOTT.EMP (DEPTNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, EMPNO) values (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: update SCOTT.EMP set DEPTNO=? where EMPNO=?
Hibernate: update SCOTT.EMP set DEPTNO=? where EMPNO=?
数据库数据
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7935 prople001
7936 pro2 41
7937 prople001 41
可以看到Hibernate先添加了员工,然后执行了update语句。由一方维持关系,hibernate每次都会执行update,当数据过多的时候消耗较大。
将Inverse改为true,控制权在多方
Dept dept = new Dept();
dept.setDname("国防部");
Emp emp1 = new Emp();
emp1.setEname("prople001");
//Emp emp2 = new Emp();
//emp2.setEname("pro2");
emp1.setDept(dept);
//级联操作控制方获取级联方信息
//dept.getEmps().add(emp1);
//dept.getEmps().add(emp2);
session.saveOrUpdate(emp1);//多方控制,保存多方
Hibernate: insert into SCOTT.DEPT (DNAME, LOC, DEPTNO) values (?, ?, ?)
可以看到,多方控制一条Insert语句就可以成功!
级联删除:删除国防部,pro1、pro2直接会被删除
在dept.hbm.xml中的set节点设置cascade为all
Dept dept = (Dept) session.get(Dept.class, 41);
session.delete(dept);
级联查询:级联查询为外链接查询
//外键对象的dept指向dept的deptno
String hql = "Select e.ename,e.comm,d.deptno,d.dname From Emp e,Dept d Where e.dept = d.deptno ";
Query query = session.createQuery(hql);
//由于HQL是对映射类的操作,所以查询关联表它并不能返回数据库表,而是返回一个数组
List<Object[]> list = query.list();
for (Object[] obj : list) {
System.out.println(obj[0]+"\t"+obj[1]+"\t"+obj[2]+"\t"+obj[3]);
}
总结:在hibernate级联关系中,一方通常设置Inverse为true将控制权交给多方。多方在代码中setdept获取一方的数据完成关系的级联操作。相当于sql中的Select语句。
查询所有的连接查询,外键表的外键ID为关联对象(emp。dept),主键表的ID为他的主键
源码:http://download.csdn.net/detail/jacxuan/9717516
Hibernate级联及控制反转的增删改查的更多相关文章
- 初识Hibernate框架,进行简单的增删改查操作
Hibernate的优势 优秀的Java 持久化层解决方案 (DAO) 主流的对象—关系映射工具产品 简化了JDBC 繁琐的编码 将数据库的连接信息都存放在配置文件 自己的ORM框架 一定要手动实现 ...
- 16~25.spring+hibernate简单实例 .连接数据库并进行增删改查
1.概念 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQ ...
- 通过API函数来控制SQLite数据库增删改查
person类属性有Intenger id,String name,Intenger age,相应的构造方法和set get方法. package com.xh.tx.dao; import and ...
- 通过Sql语句控制SQLite数据库增删改查
person类属性有Intenger id,String name,Intenger age,相应的构造方法和set get方法. package com.xh.tx.dao; import jav ...
- 14.hibernate的反向生成实现全套增删改查
图片顺序就是步骤顺序 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
- CAT XQX ---- 增删改查架构说明 1
View 层 -- 以国家为例 1. 显示 数据库的 table 页面效果 对应代码: <table id="dg" title="国家信息" cla ...
- 基于SSM之Mybatis接口实现增删改查(CRUD)功能
国庆已过,要安心的学习了. SSM框架以前做过基本的了解,相比于ssh它更为优秀. 现基于JAVA应用程序用Mybatis接口简单的实现CRUD功能: 基本结构: (PS:其实这个就是用的Mapper ...
- Struts2+Spring+Hibernate实现员工管理增删改查功能(一)之ssh框架整合
前言 转载请标明出处:http://www.cnblogs.com/smfx1314/p/7795837.html 本项目是我写的一个练习,目的是回顾ssh框架的整合以及使用.项目介绍: ...
- hibernate关联对象的增删改查------增
本文可作为,北京尚学堂马士兵hibernate课程的学习笔记. 这一节,我们看看hibernate关联关系的增删改查 就关联关系而已,咱们在上一节已经提了很多了,一对多,多对一,单向,双向... 其实 ...
随机推荐
- root权限
点击左侧终端标 步骤阅读 2 出现命令提示符 3 首先输入:sudo passwd root(设置root密码) 4 输入当前系统的账户密码(账户:admin-pc的密码) 5 输入新的root密码, ...
- GitHub上README写法暨markdown语法解读
原文: GitHub上README写法暨markdown语法解读 自从开始玩GitHub以来,就 越来越 感觉它有爱.最近对它的 README.md 文件颇为感兴趣.便写下这贴,帮助更多的还不会编写R ...
- 非常好!!!Linux源代码阅读——内核引导【转】
Linux源代码阅读——内核引导 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 目录 Linux 引导过程综述 BI ...
- Vue全局异常捕获
之前没注意过这么个小技巧 , 可能在Vue文档里也有 暂时先记下了 方便摘要 Vue全局配置 errorHandler可以进行全局错误收集,我们可以根据这个特性对前端异常做这样的处理:业务错误直接写 ...
- 程序员面试京东前端,现场JavaScript代码写出魔方特效
程序员面试京东前端,现场JS代码写出魔方特效,成功搞定20K月薪 今天小编我逛论坛,看到了一位程序员小伙子,因为是有了两年工作经验,然后去京东面试前端岗,一面二面轻松就过了,到了技术面这一块,小伙干脆 ...
- J.U.C并发框架源码阅读(八)ArrayBlockingQueue
基于版本jdk1.7.0_80 java.util.concurrent.ArrayBlockingQueue 代码如下 /* * ORACLE PROPRIETARY/CONFIDENTIAL. U ...
- Codeforces Round #446 (Div. 2) C. Pride【】
C. Pride time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...
- BZOJ1588 营业额统计 (Splay)
营业额统计 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额. ...
- Uva 12063 Zero and Ones
给个链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- 【面试题】2018年最全Java面试通关秘籍 四套!(无答案)
http://mp.weixin.qq.com/s/RQMQUufCbwlkAK62y57DAw 第一套:<2018年最全Java面试通关秘籍第一套!> 第二套:<2018年最全Ja ...