在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级联及控制反转的增删改查的更多相关文章

  1. 初识Hibernate框架,进行简单的增删改查操作

    Hibernate的优势 优秀的Java 持久化层解决方案  (DAO) 主流的对象—关系映射工具产品 简化了JDBC 繁琐的编码 将数据库的连接信息都存放在配置文件 自己的ORM框架 一定要手动实现 ...

  2. 16~25.spring+hibernate简单实例 .连接数据库并进行增删改查

    1.概念 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQ ...

  3. 通过API函数来控制SQLite数据库增删改查

    person类属性有Intenger id,String name,Intenger  age,相应的构造方法和set get方法. package com.xh.tx.dao; import and ...

  4. 通过Sql语句控制SQLite数据库增删改查

    person类属性有Intenger id,String name,Intenger  age,相应的构造方法和set get方法. package com.xh.tx.dao; import jav ...

  5. 14.hibernate的反向生成实现全套增删改查

    图片顺序就是步骤顺序 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.

  6. CAT XQX ---- 增删改查架构说明 1

    View 层  --  以国家为例 1. 显示 数据库的 table 页面效果 对应代码: <table id="dg" title="国家信息" cla ...

  7. 基于SSM之Mybatis接口实现增删改查(CRUD)功能

    国庆已过,要安心的学习了. SSM框架以前做过基本的了解,相比于ssh它更为优秀. 现基于JAVA应用程序用Mybatis接口简单的实现CRUD功能: 基本结构: (PS:其实这个就是用的Mapper ...

  8. Struts2+Spring+Hibernate实现员工管理增删改查功能(一)之ssh框架整合

    前言        转载请标明出处:http://www.cnblogs.com/smfx1314/p/7795837.html 本项目是我写的一个练习,目的是回顾ssh框架的整合以及使用.项目介绍: ...

  9. hibernate关联对象的增删改查------增

    本文可作为,北京尚学堂马士兵hibernate课程的学习笔记. 这一节,我们看看hibernate关联关系的增删改查 就关联关系而已,咱们在上一节已经提了很多了,一对多,多对一,单向,双向... 其实 ...

随机推荐

  1. [02]a tag只为成button用时候设置href的办法

    a tag为成button使用,把JavaScript动作处理时,有如下四种停止Event效果. <a href="#"> <a href="javas ...

  2. Balanced Photo(USACO)

    题目大意: 我们有一个数列,数列中有n个数,对于一个数ai,在它左边的比他大的数的个数为li,右边比他大的数的个数为ri,若li,ri中的较大者比较小者的两倍还大,那么他就是一个不平衡数,求不平衡数的 ...

  3. 生成一个空白BMP的简单代码【转】

    转自:http://blog.chinaunix.net/uid-15063109-id-4275395.html 做图像处理时,有时需要临时生成图使用.以下是生成320x240 24位图的一个简单的 ...

  4. 【转载】无需图片,使用CSS3实现圆角按钮

    原文地址:http://www.open-open.com/home/space-37924-do-blog-id-5789.html 首先来看看效果: 事例HTML代码: <a href=&q ...

  5. [BZOJ1032][JSOI2007]祖码Zuma 区间dp

    1032: [JSOI2007]祖码Zuma Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1105  Solved: 576 [Submit][S ...

  6. (3)WPF 布局

    一.布局原则 二.布局过程 三.布局容器 核心布局面板 布局属性

  7. 洛谷 P1060 开心的金明【DP/01背包】

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就 ...

  8. Codeforces 871D Paths (欧拉函数 + 结论)

    题目链接  Round  #440  Div 1  Problem D 题意   把每个数看成一个点,如果$gcd(x, y) \neq 1$,则在$x$和$y$之间连一条长度为$1$的无向边.   ...

  9. BZOJ 2243 [SDOI2011]染色 (树链剖分)(线段树区间修改)

    [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6870  Solved: 2546[Submit][Status][Disc ...

  10. POJ 3470 Walls(线段树+扫描线)

    [题目链接] http://poj.org/problem?id=3470 [题目大意] 给出几面墙,均垂直于x轴或者y轴,给出一些鸟的位置(二维坐标点), 鸟只会垂直x轴或者y轴飞行,并且会撞上最近 ...