在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

最新文章

  1. 简述我的SOA服务治理
  2. &lt;实训|第五天&gt;通过搭建NFS,FTP实现共享文件附Vim脚本游戏
  3. ubuntu 允许端口被连接
  4. rhel-server-7.2-x86_64无法联网(VMware环境)
  5. ubuntu 的远程桌面
  6. mysql中中文字符串的截取
  7. Embedded Linux Primer----嵌入式Linux基础教程--章节介绍
  8. Wpf ScrollViewer with WrapPanel 使用鼠标滚轮水平滚动内容
  9. jxls2.3-简明教程
  10. winform利用委托delegate进行窗体间通信
  11. [翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能
  12. python 脚本自动登陆校园网
  13. SSD: ReLU6
  14. weblogic为同一domain下的不同server添加不同参数
  15. 接口自动化测试框架-AIM
  16. Android设置横屏竖屏
  17. MFC截图和界面刷新相关问题
  18. Spark - 经典案例
  19. 安装icephp 记
  20. PHP通过mysqli连接mysql数据库

热门文章

  1. DiskGenius
  2. 在 Tomcat 中配置 SSL/TLS 以支持 HTTPS
  3. RQNOJ 34 紧急援救
  4. eclipse块编辑
  5. Android控件介绍
  6. MFC CString GetBuffer/ReleaseBuffer 的使用条件
  7. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2
  8. javascript 仿面向对象编程实例代码(私有,公共变量。。。)
  9. 阿里最新出的图书《码出高效:Java开发手册》宣传手册图片里出了比较搞笑的错误,大家没有发现?
  10. thinkphp函数学习(3): C函数详解