第六章 Hibernate关联映射

第六章 hibernate关联映射
一、本章知识点分为2部分:
1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系
2.延迟加载:类级别加载策略,一对多加载策略,多对一加载策略
二、关联关系
1.单向多对一关联关系
1.1.概念(什么是单向多对一关联关系,举例说明)
  以部门(Dept)、Emp(员工)为例: 从员工角度看部门,是多个员工都在一个部门,这就叫单向
如部门编号为20的部门下可以有n个员工(如scott账户下emp表 empno 为7369,7566,7788等),即这n个员工在emp表的deptno字段上都是20.
当我们查询 员工7369这条数据时,可以获得这个员工信息对应的Emp对象。
  Emp e = (Emp)session.get(Emp.class,7356);//根据主键id获取员工信息
//打印员工编号、部门编号,
   System.out.println("员工:"+e.getEmpNo()+" 所在部门为:"e.getDeptno());
//如果需要获取部门名称等信息还需根据deptno去查dept表
  session.createQuery("from Dept where deptno = 20");
//hibernate 中对于这种单向多对一提供了便捷操作,将EMP表对应的Emp实体类中deptno属性由外键字段更改为Dept实体类就可以获得相应部门实体对象。如下
   实体类Emp 中 原  private Byte deptno; 改为 private Dept dept;
   实体类做了更改那么对应的Emp 映射文件也就要随之改变。如下
   原映射文件中
   <property name="deptno"  type="java.lang.Byte" column="DEPTNO"></property> 改为
   <manny-to-one  name="dept" class="com.bdqn.entity.Dept" column="DEPTNO"></many-to-one>
这样就达到了单向多对一关联关系配置,我们再去更改一下刚才测试代码。
  Emp e = (Emp e)session.get(Emp.class,7356);//根据主键id获取员工信息
  Dept d = e.getDept();//获取员工对应的部门
  System.out.println("员工:"+e.getEmpNo()+" 所在部门为:"d.getDeptName());//
 总结:单向多对一实质是能够在"多"这个实体上获取"一"的信息。具体语法重点如下:
  (1) 在"多"这个实体上去配置"一",即将"一"这个外键属性更改为实体对象。
  (2) "多"对应的映射文件上的外键属性节点由普通的<property />节点替换成<many-to-one/>节点。其中class 属性配置为"一"的实体类型以替换原来property节点的type属性,其他属性(name,column)配置和property 节点一样。
1.3 单向多对一增删改。
参照示例5,6,7.
每操作一步去看下myeclipse 中控制台答应的sql.
如果控制台没有sql 输出,则是hibernate没有配置允许sql打印信息。则需在hibernate.cfg.xml 中增加以下节点
<property name="show_sql">true</property><!-- 是否控制台打印sql ,true为打印,false 为不打印 -->
<property name="format_sql">true</property><!-- 打印sql是否格式化 -->

2 双向一对多关联
2.1 概念
 以部门(Dept)、Emp(员工)为例: 从部门角度看看,一个部门有多个员工,这就叫单向一对多。而从双向上来看就是一个是单向一对多,一个是单向多对一,我们统称为一对多双向关联或者多对一双向关联。
2.2  配置与语法(单向一对多)
     如部门编号为20的部门下可以有n个员工(如scott账户下emp表 empno 为7369,7566,7788等),即这n个员工在emp表的deptno字段上都  是20.
   当我们查询 部门号为20这条数据时,可以获得这个部门信息对应的Dept对象。
    Dept d = (Dept)session.get(Dept.class,20);//根据主键id获取部门信息
    System.out.println("部门编号:"+d.getDeptNo()+" 所在部门为:"e.getDeptName());
//如果需要获取部门内员工等信息还需根据deptno去查Emp表
  List<Emp> empList = session.createQuery("from Emp where deptno = 20");
//hibernate 中对于这种单向一对多提供了便捷操作,在Dept实体类中增加结婚<Set> emps 属性。如下
   实体类Dept 中增加 private Set<Emp> emps = new HashSet<Emp>();//这个集合代表这个部门下所有员工的信息
   实体类做了更改那么对应的Dept 映射文件也就要随之改变。如下
   原映射文件中增加<Set> 节点
 <set name="emps"><!-- 与与实体类属性emps保持一致,即 Set<Emp> emps ,代表这个部门下所有员工的集合 -->
   <one-to-many class="cn.bdqn.entity.Emp" />
    <key column="DEPTNO" ></key>
  </set>
 <!--以上代码 意义是   
   1.emps 代表某一部门下所有员工记录(即实体类Emp)。
   2.emps 是hibernate 通过 查询class属性配置的-->Emp实体类-->找到对应EMP,然后通过 配置的key节点下的column属性
 -->找到该部门下所有员工的。这个过程相当于Hibernate自己可以完成,我们只需要配置后直接调用就行了。
  这样就达到了单向多对一关联关系配置,我们再去更改一下刚才测试代码。
  Dept d = (Dept)session.get(Dept.class,20);//根据主键id获取部门信息
  Set<Emp> emps = d.getEmps();
  for(Emp e :emps){
   System.out.println("部门编号:"+d.getDeptNo()+" 员工编号为:"e.getEmpNo());
  }
  总结:单向多对一实质是能够在"一"这个实体上获取"朵"的信息。具体语法重点如下:
  (1) 在"一"这个实体上去配置"多",即增加"一"实体对象集合。
  (2) "一"对应的映射文件上的增加<set>节点。
  <set name="emps"><!-- 与与实体类属性emps保持一致,即 Set<Emp> emps ,代表这个部门下所有员工的集合 -->
   <one-to-many class="cn.bdqn.entity.Emp" />
    <key column="DEPTNO" ></key>
  </set>
2.3  双向关联下的增删改(主要是单向一对多 中 set 的设置)
  1.cascade
  参照示例9,10,11.
  每操作一步去看下myeclipse 中控制台答应的sql.
   2.inverse
  参照示例12以及后续代码.
  每操作一步去看下myeclipse 中控制台答应的sql.
    3.order-by
  参照示例13.
  每操作一步去看下myeclipse 中控制台答应的sql.
3.双向关联
  和多对一类似,可自己总结。

4延迟加载
  分为:类级别加载策略,一对多加载策略,多对一加载策略
 
 
 4.1类延迟加载策略<class  lazy="true/false">默认为true
    关联函数:
            代理对象:session.load(*.class,id);当lazy为true时,返回代理对象,即只有OID的实体类对象
                      session.get(*.class,id);无论lazy为true或false,返回的都是全数据对象
                      Query;HIbernate.initialize();
                      
                      
 4.2一对多加载策略<set lazy="true/false/extra" />
        当lazy为true时,dept下emps为空集合,当lazy为false时,dept下emps为代理对象集合
        关联函数:get(*.class,id);当lazy为true时,set<Emp> 集合为空
        set常用方法size();iterator();contain();isEmpty();
        在lazy为true时,可初始化set数据
        lazy为extra时,size();iterator();contain();isEmpty()这些方法初始化无效
        
        
 4.3多对一加载策略<many-to-one lazy="proxy/no-proxy/false">
    false:全数据;
    proxy:带OID的对象;
    no-proxy:无;
    
5 OpenSessionInView
 ......

时间: 2024-10-21 02:49:35

第六章 Hibernate关联映射的相关文章

Hibernate关联映射(单项多对一和一对多、双向一对多)

最近总是接触着新的知识点来扩展自己的知识面:不停的让自己在原地接触天空的感觉真的很美好!!!革命没有成功,程序员的我们怎么能不努力呢...... 一.用员工和部门来剖析关联映射的原理. 1)从这张截图可以看出我会站在员工的角度讲述:(单向关联) 关系:(多个员工对应一个部门)多对一的关系 意味:多个Emp对象只会引用一个Dept对象 方法:在Emp类中定义一个Dept类型属性,来引用所有关联的Dept对象 eg. 第一步建立两个实体类省略 第二步建立大配置 <?xml version='1.0'

hibernate关联映射(一对多)

这篇博客将会给大家带来hibernate的关联映射的学习.在现实生活中,不仅只是一对一的映射关系,更多的是一对多,多对多等. 一对多单项关联映射 这里我以网盘为例,一个用户可以拥有多个文件,及用户和文件之间是一对多的关系. user实体类: public class Users { private int uid; private String uname; //用户上传的所有文件 // one方 可以获取 many方 private Set<UpFile> files = new HashS

hibernate关联映射

本文可作为北京尚学堂马士兵hibernate课程的学习笔记. hibernate的映射,主要分为一对一,一对多,多对一,多对多,同时还要单向与双向的区别. OK,不要纠结于名字,我们开始看例子. 一对一单向 老公是一个实体,老婆也是一个实体. 一个老公只有一个老婆,同时一个老婆也只有一个老公. 上面的关系就叫做一对一. 什么叫单向呢. 看代码: package com.bjsxt.hibernate; @Entity public class Husband { private int id;

hibernate关联映射【一对一主键】

从三个部分介绍Hibernate一对一主键关联映射. 1.基本介绍2.代码展示3.总结注意  1.基本介绍 一对一关联有两种情况: 单向一对一主键关联.双向一对一主键关联.一对一主键关联: 是指两个表之间通过主键形成一对一的映射,例如,每个公民只允许拥有一个身份证,公民与身份证就是一对一的关系,定义两张表,一张People表,一张IdCard表,People表的id既是该表的主键也是该表的外键,并且People的id也就是IdCard的id, 2.代码 单向一对一主键关联:people表的id既

Hibernate关联映射 映射文件的配置

一:多对一单向关联 首先我们必须创建两个实体类 例如:Dept类 public class Dept { private Integer deptNo; private String dName; private String loc; private Set<Employee> emps=new HashSet<Employee>(); Employee类 public class Employee { private Integer empno; private String

Hibernate关联映射关系

一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实体类(Emp(员工),Dept(部门)) /* * 员工实体类 */public class Emp { private Integer empId; //员工编号 private String empName; //员工姓名 private Dept dept; //所处部门 //get(),set()方法省略 } /* * 部

Hibernate 关联映射

ORM(Object Relational Mapping)对象/关系映射 说到Hibernate的关联映射就必须要提一提ORM了.那么ORM是什么呢,其是一种持久化技术,他在对象模型和关系型数据库之间建立对象关系,通过操作JavaBean对象来完成对数据库的操作! 注意:ORM是概念化的并不是实际存在的,可以理解为其是一种编程思想,而Hibernate框架就是该思想的实现产品! 配置Po对象(和数据表绑定的持久化对象)的关联关系 从上面说到ORM可以在对象模型和数据库之间建立对应关系而在Hib

hibernate关联映射之一对多&amp;多对一

package loaderman.b_one2Many; import java.util.HashSet; import java.util.Set; public class Dept { private int deptId; private String deptName; // [一对多] 部门对应的多个员工 private Set<Employee> emps = new HashSet<Employee>(); public int getDeptId() { re

Hibernate关联映射之_多对一

多对一 Employee-Department 对于 员工 和 部门 两个对象,从员工的角度来看,就是多对一的一个关系--->多个员工对应一个部门 表设计: 部门表:department,id主键 员工表:employee,id主键,depart_id作为外键,与部门表的主键对应 对象模型设计: 部门: 1 package org.zln.hibernate.domain; 2 3 /** 4 * 部门Domain对象 5 * Created by sherry on 000018/6/18 2