博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate关联映射之延迟加载
阅读量:6672 次
发布时间:2019-06-25

本文共 2277 字,大约阅读时间需要 7 分钟。

什么事延迟加载?

     当真正需要数据时才执行SQL语句,其本意是减少不必要的性能开销!

之前提到过一个延迟加载的例子:

  load();结果集不能为空

  当真正去打印对象属性时,sql语句才执行!

  

hibernate的lazy属性:

  lazy属性

    类级别:true(默认)/false

    一对多关联级别:true(默认)/extra(加强延迟加载)/false

    多对一关联级别:proxy(默认)/no-proxy(无代理加载)/false

  下面用代码来区别他们:

  类级别: 

    这里使用load()属性,get()属性在操作类级别时不具备延迟加载特性 

1 /** 2      * 测试延迟加载 3      */ 4     public void get(){ 5         session=factory.openSession(); 6         session.beginTransaction(); 7         //类加载 8         Student stu=(Student)session.load(Student.class,2); 9         //测试10         System.out.println("--输出了--");11         //输出姓名12         System.out.println(stu.getName());13         session.close();14     }15 16 /**17 *--输出了--18 *Hibernate: 19 *    select20 *       student0_.stuno as stuno1_0_,21 *        student0_.name as name1_0_,22 *        student0_.gradeid as gradeid1_0_ 23 *    from24 *        student student0_ 25 *    where26 *        student0_.stuno=?27 *小芳28 *29 **/

  可以看到延迟加载了!

  现在我修改class lazy属性为false;

/***
**//**get()方法里面代码不变**//***Hibernate: * select* student0_.stuno as stuno1_0_,* student0_.name as name1_0_,* student0_.gradeid as gradeid1_0_ * from* student student0_ * where* student0_.stuno=?*--输出了--*小芳***/

一对多关联级别:

  现在我们将类级别去掉,一对多关联获取一遍,使用session.get()方法测试

   

1 /** 2      * 一对多延迟加载 3      */ 4     public void getByone2more(){ 5         session=factory.openSession(); 6         session.beginTransaction(); 7         //类加载 8         Grade grade=(Grade)session.load(Grade.class,2); 9         Set
stu=grade.getStu();10 11 //测试12 System.out.println("--输出了--");13 //输出集合大小14 System.out.println(stu.size());15 //输出姓名16 for(Student st:stu){17 System.out.println(st.getName());18 19 }20 session.close();21 22 23 }

默认配置下:

  跟前面的一样,先查询年级。打印”输出了“;

  先执行了get()发起的select语句!

 

更改lazy 属性为 extra:

输出结果: 

  

  注释掉打印学生那句:

  会发现查询总记录时,select count(stuno),我们在将extra改为true,这时候查询语句select stuno,name......

  总结:

    有的时候我们只需要知道集合中元素的个数,或者集合是否为空,并不需要知道都有哪些数据时,可以使用extra提高效率。

可见加强延迟加载采用了特定的语句查询必要的语句

 

--多对一

  默认的lazy属性值为proxy;

  设置为proxy时,延迟加载,同上,当查询 id时,不会执行sql去查询!

 

转载于:https://www.cnblogs.com/gcs1995/p/4146872.html

你可能感兴趣的文章
Apollo 3.0来了!百度自动驾驶硬件系统全解读
查看>>
你或许不知道Vue的这些小技巧
查看>>
Vue2.0进阶组件篇1 教你秒撸(短信倒计时组件)
查看>>
测试你的前端代码 - part2(单元测试)
查看>>
使用 Cocos Creator 打造自己的爆款小游戏《方块弹珠》!
查看>>
PHP 依赖注入 (DI) 和容器 (IoC) 的简单实现
查看>>
BCH文件安全存储系统——BFP
查看>>
Python | 数据分析实战Ⅰ
查看>>
Salesforce开源TransmogrifAI:用于结构化数据的端到端AutoML库
查看>>
社会的分工合作(ASIC)才是带来人类富裕的基础
查看>>
全面剖析SharedPreferences
查看>>
0826 - 事情多到让人绝望啊
查看>>
Logback中使用TurboFilter实现日志级别等内容的动态修改
查看>>
Spring Boot中增强对MongoDB的配置(连接池等)
查看>>
网络安全-CSRF
查看>>
Andorid Studio NDK开发-Hello World
查看>>
IDEA中maven工程指定JDK版本
查看>>
Git 详细的操作指南笔记(从零开始)
查看>>
【手把手带你撸一个脚手架】第二步, 搭建开发环境
查看>>
JS专题之严格模式
查看>>