SSH与SSM学习之hibernate24——关联级别加载策略之属性关联加载策略
来源:互联网 发布:软件著作权 代理 编辑:程序博客网 时间:2024/05/16 11:21
- SSH与SSM学习之hibernate24关联级别加载策略之属性关联加载策略
- 一说明
- 二laze和fetch的取值
- 三Companyhbmxml配置
- 四Employeehbmxml
- 五测试代码
- 六fetch为select proxy对应的对象取值为true测试
- 七fetch为select proxy对应的对象取值为false测试
- 八fetch为join测试
- 九结论
- 十no-session问题解决 扩大session的作用范围
SSH与SSM学习之hibernate24——关联级别加载策略之属性关联加载策略
一、说明
现在我们说的是 属性关联加载策略。和之前的 SSH与SSM学习之hibernate23——关联级别加载策略之集合关联加载策略 区别是
集合关联说的是:通过一个对象,获取到与它关联的集合数据,例如:通过公司,获取到员工(多个),这是一个集合
属性关联说的是:通过一个对象,获取到与它关联的对象数据,例如:通过员工,获取到公司(一个),这是一个属性
属性关联使用到的是 lazy和fetch
二、laze和fetch的取值
lazy叫做懒加载或者延迟加载,取值如下
fetch(抓取策略),决定加载策略.使用什么类型的sql语句加载集合数据。取值如下
下面我们分为二者的属性值两两配对(笛卡尔积)测试
第一行代表,lazy的取值
第一列代表,fetch的取值
我们知道 proxy 由相关类的类加载策略决定的,当proxy=false的时候,和 属性关联的lazy为false是一样的。
所以我们只需要验证下面的四种情况
三、Company.hbm.xml配置
.....<hibernate-mapping package="com.qwm.hibernate03.domain" > <!--测试中所说的 proxy的值为其实就是下面这个lazy的值--> <class name="Company" table="tb_company" lazy="true"> ..... </class></hibernate-mapping>
四、Employee.hbm.xml
<?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.qwm.hibernate03.domain" > <class name="Employee" table="tb_employee" > <id name="em_id" > <generator class="native"></generator> </id> <property name="name" ></property> <!-- fetch 决定加载的sql语句 select: 使用单表查询 join : 多表查询 lazy 决定加载时机 false: 立即加载 proxy: 由Company的类级别加载策略决定. --> <many-to-one name="company" column="com_id" class="Company" fetch="select" lazy="proxy"/> </class></hibernate-mapping>
五、测试代码
/** * 所有的测试代码都是一样的 */@Testpublic void test1(){ Session session = HibernateUtils.openSession(); Transaction t = session.beginTransaction(); //---------------------------------------------- //获取到员工 Employee employee = session.get(Employee.class,1L); System.out.println("-------------one--------------"); //获取到公司 Company c = employee.getCompany(); System.out.println("-------------two--------------"); //使用公司 System.out.println(c); //---------------------------------------------- t.commit(); session.close();}
六、fetch为select, proxy对应的对象取值为true测试
Hibernate: select employee0_.em_id as em_id1_1_0_, employee0_.name as name2_1_0_, employee0_.com_id as com_id3_1_0_ from tb_employee employee0_ where employee0_.em_id=?-------------one---------------------------two--------------Hibernate: select company0_.id as id1_0_0_, company0_.name as name2_0_0_ from tb_company company0_ where company0_.id=?Company{id=1, name='百鸟公司'}
fetch为select, proxy对应的对象取值为true。单表查询,使用了懒加载,属性只有使用的时候采取查询。
七、fetch为select, proxy对应的对象取值为false测试
Hibernate: select employee0_.em_id as em_id1_1_0_, employee0_.name as name2_1_0_, employee0_.com_id as com_id3_1_0_ from tb_employee employee0_ where employee0_.em_id=?Hibernate: select company0_.id as id1_0_0_, company0_.name as name2_0_0_ from tb_company company0_ where company0_.id=?-------------one---------------------------two--------------Company{id=1, name='百鸟公司'}
fetch为select, proxy对应的对象取值为false。单表查询,直接查询数据。使用的时候,直接使用。
八、fetch为join测试
fetch为join的时候,lazy失效。使用多表查询,直接加载
Hibernate: select employee0_.em_id as em_id1_1_0_, employee0_.name as name2_1_0_, employee0_.com_id as com_id3_1_0_, company1_.id as id1_0_1_, company1_.name as name2_0_1_ from tb_employee employee0_ left outer join tb_company company1_ on employee0_.com_id=company1_.id where employee0_.em_id=?-------------one---------------------------two--------------Company{id=1, name='百鸟公司'}
九、结论
结论:为了提高效率.fetch的选择上应选择select. lazy的取值应选择 true. 全部使用默认值.
十、no-session问题解决: 扩大session的作用范围.
我们使用懒加载的策略,那么查询完成以后,session就关闭了。这个时候我们的使用到了属性,这个时候由于是懒加载,所以回去查询数据,然而session已经关闭了,那么就会抛出 no-session 的异常。
对于这个问题的解决,就是扩大session的作用范围。打开session和关闭session 都放到 Filter中。
- SSH与SSM学习之hibernate24——关联级别加载策略之属性关联加载策略
- SSH与SSM学习之hibernate23——关联级别加载策略之集合关联加载策略
- SSH与SSM学习之hibernate22——类级别加载策略
- Hibernate懒加载、关联级别加载策略
- Hibernate中类级别和关联级别加载策略
- Hibernate延迟加载(查询优化),关联级别延迟加载优化策略
- EF之关联加载
- mybaties之关联查询与延迟加载
- Hibernate学习之抓取策略与懒(延迟)加载
- Hibernate检索策略学习之--立即加载
- Hibernate检索策略学习之--延迟加载
- Hibernate检索策略学习之--批量加载
- Flash学习笔记之XmlManager加载策略
- EF性能之关联加载
- EF性能之关联加载
- hibernate加载策略之lazy
- hibernate加载策略之lazy
- hibernate☞FetchType关联关系的加载策略
- 类比C++ 学习Python的class
- WEB_01_HTML概述
- Monkeyrunner--自动化测试工具
- macos下java版本动态切换
- Android视频直播的实现
- SSH与SSM学习之hibernate24——关联级别加载策略之属性关联加载策略
- varnish缓存配置详解
- maven新建 webapp项目后JSP文件报错怎样chul
- 实验一线性表的基本操作实现及其应用(JavaScript实现)
- 【笔记】《WebGL编程指南》学习-第2章WebGL入门(5-通过鼠标点击画点)
- WIN10桌面图标消失,且右键失效
- Android酷炫实用的开源框架(UI框架)
- 自定义数据库连接池
- 数据库五:浅谈数据库隔离级别与锁机制