hibernate的lazy的使用

引用:https://blog.csdn.net/Vincent_yuan1991/article/details/53482487
一:
lazy,延迟加载
Lazy的有效期:只有在session打开的时候才有效;session关闭后lazy就没效了。
lazy策略可以用在:

  • 标签上:可以取值true/false
  • 标签上,可以取值true/false,这个特性需要类增强
  • /等集合上,可以取值为true/false/extra
  • /等标签上,可以取值false/proxy/no-proxy
    6.1 get和load的区别:
  • get不支持延迟加载,而load支持。
  • 当查询特定的数据库中不存在的数据时,get会返回null,而load则抛出异常。
    6.2 类(Class)的延迟加载:
  • 设置标签中的lazy=“true”,或是保持默认(即不配置lazy属性)
  • 如果lazy的属性值为true,那么在使用load方法加载数据时,只有确实用到数据的时候才会发出sql语句;这样有可能减少系统的开销。
  • //不会发出查询sql
    System.out.println(“group id=” + group.getId());
    这里有一个问题,为什么加载主键的时候不需要发出sql语句。
    6.3 集合(collection)的延迟加载:可以取值true,false,extra
  • 保持集合上的lazy的默认值,此时的效果和lazy="extra"是基本一样的。
    • 设置集合上的lazy=extra,此时的效果和lazy属性的默认值是基本一样的。但是推荐使用这个属性值,因为在统计时这种情况显得比较智能。当然延迟是有效果的。
  • 设置集合上的lazy=false
    true:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其集合元素的数据
    false:取消懒加载特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据
    extra:一种比较聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate
    并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据
    6.4 Hibernate单端关联懒加载策略:即在/标签上可以配置
    懒加载策略。可以取值为:false/proxy/no-proxy
    false:取消懒加载策略,即在加载对象的同时,发出查询语句,加载其关联对象
    proxy:这是hibernate对单端关联的默认懒加载策略,即只有在调用到其关联对象的方法的时候才真正发出查询语句查询其对象数据,其关联对象是代理类
    no-proxy:这种懒加载特性需要对类进行增强,使用no-proxy,其关联对象不是代理类
    注意:在class标签上配置的lazy属性不会影响到关联对象!!!

二:
a

懒加载可以提高性能吗?
不可以简单的说"能",因为Hibernate的关系映射拖累了SQL的性能,所以想出懒加载来弥补.只是弥补而以,不会超越.所以大家不要想着使用了懒加载总体性能就提高了,其实总体性能不下降就万幸了.

Hibernate的lazy属性可以配置在:

(常用)标签上 ,可以取值true,false,extra
默认为true,当为true时,会懒加载,访问集合属性时再发出SQL语句.但set.size()时,很不智能,不会生成count()语句,而是查出所有记录赋值给set.
extra说明:调用集合的set.size()时,会生成select count(*)from tableName,比较智能.建议使用
(少用)标签上 ,可以取值false,proxy,noproxy
当为true时,会有懒加载特性,当为false时会产生N+1问题,比如一个学生对应一个班级,用一条SQL查出10个学生,当访问学生的班级属性时Hibernate会再产生10条SQL分别查出每个学生对应的班级.
(不用)标签上 ,可以取值true,false
默认为true,当为false时,load()方法将失去懒加载的特性与get()一样,不影响集合()标签上的lazy特性
(不用)标签上 ,可以取值true,false
默认值为false,懒加载某个字段,无意义,不要使用


get()与load()的区别
get()无懒加载特性,马上执行SQL查询.
load()有懒加载特性,会返加一个代理对象,所以永远不为null,先不执行SQL,要取对象的值时才执行SQL语句,前题session不能关闭,标签上lazy不为false.


实现懒加载的前提: 1 PO不能是final的
2 能实现懒加载的对象(PO)都是被CGLIB改写的代理对象,所以不能是final修饰的
3 须要asm,cglib两个jar包
4 相应的lazy属性为true
5 相应的fetch属性为select

什么时候出遇到懒加载
1 使用load()
2 一对一
查主对象 默认使用join连接,不会发生懒加载
查从对象 默认会发生懒加载,先执行一句select查出从对象,当通过从对象访问了主对象时,再执行一句select查出主对象.

3 多对一
在使用hbm.xnl时,取多的一方时,默认会懒加载,不取一的一方
在使用JPA时,取多的一方时,默认自动使用join on语句取出一的一方(用户与组,用户是多的一方,组是一的一方)

4 一对多()
默认会懒加载,这是必须的,是重常用的。


实现懒加载的方案:

方法一:(没有使用懒加载)
用 Hibernate.initialize(de.getEmps()) 提前加载一下.

方法二:
把与Session脱离的对象重新绑定
lock()方法是用来让应用程序把一个未修改的对象重新关联到新session的方法。
//直接重新关联
session.lock(fritz, LockMode.NONE);
//进行版本检查后关联
session.lock(izi, LockMode.READ);
//使用SELECT … FOR UPDATE进行版本检查后关联
session.lock(pk, LockMode.UPGRADE);

方法三:
OpenSessionInView
参见 http://www.javaeye.com/topic/32001

fetch 和 lazy 配置用于数据的查询

lazy 参数值常见有 false 和 true,Hibernate3 映射文件中默认lazy = true ;

fetch 指定了关联对象抓取的方式,参数值常见是select和join,默认是select, select方式先查询主对象,再根据关联外键,每一个对象发一个select查询,获取关联的对象,形成了n+1次查询;而join方式,是left outer join查询,主对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。

在映射文件中,不同的组合会使用不同的查询:
1、lazy=“true” fetch = “select” ,使用延迟策略,开始只查询出主对象,关联对象不会查询,只有当用到的时候才会发出sql语句去查询 ;

2、lazy=“false” fetch = “select” ,没有用延迟策略,同时查询出主对象和关联对象,产生1+n条sql.

3、lazy="true"或lazy=“false” fetch = “join”,延迟都不会作用,因为采用的是外连接查询,同时把主对象和关联对象都查询出来了.

另 外,在hql查询中,配置文件中设置的join方式是不起作用的,而在其他查询方式如get、criteria等是有效的,使用 select方式;除非在hql中指定join fetch某个关联对象。fetch策略用于get/load一个对象时,如何获取非lazy的对象/集合。 这些参数在Query中无效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React中路由组件与一般组件

四、路由组件与一般组件 1.写法不同&#xff1a;一般组件&#xff1a;<Demo/>路由组件&#xff1a;<Route path"/demo" component{Demo}/>2.存放位置不同&#xff1a;一般组件&#xff1a;components路由组件&#xff1a;pages3.接收到的props不同&#…

第六期.Net开源社群联合分享--除了情结和价格,Azure最适合什么场景?等你来讲趟坑的实战经验!

嘿嘿&#xff0c;大家好啊&#xff01;好荣幸啊这一期&#xff0c;能够咱们.NET开源社区一块来做这次线上分享会。 我就是各位小伙伴可爱而且博学而且低调而且人见人爱花见花开而且谦虚但是经常口不择言的主持人老板娘Grace。 这次有新朋友&#xff0c;有老朋友&#xff0c;有…

jQuery选择器整理

第六章jQuery选择器一、jQuery选择器的分类&#xff1a; 1.基本选择器 2.层次选择器 3.属性选择器 4.基本过滤选择器 5.可见性过滤选择器 二、jQuery的基本选择器&#xff1a; ///基本选择器 //id选择器 //$("#div1").css(“background”,“red”); //class选择器 /…

遍历HashMap的四种方法

在Map集合中 values():方法是获取集合中的所有的值----没有键&#xff0c;没有对应关系&#xff0c; KeySet(): 将Map中所有的键存入到set集合中。因为set具备迭代器。所有可以迭代方式取出所有的键&#xff0c;再根据get方法。获取每一个键对应的值。 keySet():迭代后只能通…

支付系统的防重设计

转载自 支付系统的防重设计 导读 “目前在互联网应用的大部分支付场景中&#xff0c;对接支付宝、微信移动支付产品这样需要用户参与支付流程的支付方式已经变得非常普遍&#xff0c;类似的还有PC端银行网银支付&#xff1b;而通过绑定用户银行卡、对接银行卡快捷支付通道直接…

React中antd的按需引入+自定主题

antd的按需引入自定主题 1.安装依赖&#xff1a;yarn add react-app-rewired customize-cra babel-plugin-import less less-loader2.修改package.json...."scripts": {"start": "react-app-rewired start","build": "react-app-…

Windows Server Containers 支持 Windows 开发者使用 Docker

在过去几年里&#xff0c;Docker 和容器已成为全球开发界和企业最热门的话题之一。去年秋天发布的 Windows Server 2016 支持 Windows 开发者使用容器&#xff0c;使得这一热门话题再次升温。Windows 和 Docker 是如何走到一起的&#xff1f; 一切始于 2014 年隆重举办的普吉特…

漫画:什么是二叉堆?(修正版)

转载自 漫画&#xff1a;什么是二叉堆&#xff1f;&#xff08;修正版&#xff09; 什么是二叉堆&#xff1f; 二叉堆本质上是一种完全二叉树&#xff0c;它分为两个类型&#xff1a; 1.最大堆 2.最小堆 什么是最大堆呢&#xff1f;最大堆任何一个父节点的值&#xff0c;都…

React路由组件传递参数

向路由组件传递参数 1.params参数路由链接(携带参数)&#xff1a;<Link to/demo/test/tom/18}>详情</Link>注册路由(声明接收)&#xff1a;<Route path"/demo/test/:name/:age" component{Test}/>接收参数&#xff1a;this.props.match.params2.se…

jQuery选择器案例之——index.js

$(function(){//alert(a);///基本选择器//id选择器//$("#div1").css("background","red");//class选择器//$(".p1").css("color","red");//标签选择器//$("p").css("color","red")…

漫画:什么是堆排序

转载自 漫画&#xff1a;什么是堆排序 在上一篇漫画中&#xff0c;小灰介绍了 二叉堆 这样一种强大的数据结构&#xff1a; 漫画&#xff1a;什么是二叉堆&#xff1f;&#xff08;修正版&#xff09; 那么&#xff0c;这个二叉堆怎样来使用呢&#xff1f;我们这一期将会详…

监控——《微服务设计》读书笔记

在单块应用的世界里&#xff0c;当我们遇到问题时&#xff0c;我们至少清楚从哪里开始调查。网站访问速度&#xff1f;网站访问异常&#xff1f;CPU占用过高&#xff1f;这些都是单块应用程序的问题&#xff0c;单一的故障点会极大地简化对问题的排查。 而现在我们面对了多个微…

React中的模糊匹配与精准匹配

路由的严格匹配与模糊匹配 1.默认使用的是模糊匹配&#xff08;简单记&#xff1a;【输入的路径】必须包含要【匹配的路径】&#xff0c;且顺序要一致&#xff09;2.开启严格匹配&#xff1a;<Route exact{true} path"/about" component{About}/>3.严格匹配不要…

jQuery中的事件与动画

一、jQuery中的事件&#xff1a; 1.基础事件 &#xff08;1&#xff09;鼠标事件 &#xff08;2&#xff09;键盘事件 &#xff08;3&#xff09;window事件 2.复合事件 &#xff08;1&#xff09;鼠标光标悬停 &#xff08;2&#xff09;鼠标连续点击 二、鼠标事件&#xff1a…

什么是 TCC分布式事务

转载自 什么是 TCC分布式事务 近两年微服务变得越来越火热&#xff0c;各种框架与组件的出现&#xff0c;更是为微服务的开发提供了便利。 我们都知道&#xff0c;每个微服务都是一个对应的小服务&#xff0c;多个服务之间可以方便的进行功能的组合&#xff0c;来形成功能更…

.NET跨平台实践:再谈用C#开发Linux守护进程 — 完整篇

Linux守护进程是Linux的后台服务进程&#xff0c;相当于Windows服务&#xff0c;对于为Linux开发服务程序的朋友来说&#xff0c;Linux守护进程相关技术是必不可少的&#xff0c;因为这个技术不仅仅是为了开发守护进程&#xff0c;还可以拓展到多进程&#xff0c;父子进程文件描…

React中解决样式丢失问题

解决多级路径刷新页面样式丢失的问题 1.public/index.html 中 引入样式时不写 ./ 写 / &#xff08;常用&#xff09;2.public/index.html 中 引入样式时不写 ./ 写 %PUBLIC_URL% &#xff08;常用&#xff09;3.使用HashRouter

使用jQuery操作DOM元素

一、DOM分类&#xff1a; 1.DOM core 2.Html-DOM 3.CSS-DOM 二、css样式 $(this).css(“font-size”,“25px”); $(this).css({“font-size”:“30px”,“color”:“white”}); $("#div3").addClass(“div3_style”); //移除样式 $("#div3").removeClass(…

静态代理

1、接口 package AOP.proxy;/*** Created by Administrator on 2019/6/11.*/ public interface PersonDao {public void savePerson(); }2、目标实现类 package AOP.proxy;/*** Created by Administrator on 2019/6/11.*/ public class PersonDaoImpl implements PersonDao {…

选择大公司还是小公司

转载自 选择大公司还是小公司 本文转载自公众号 stormzhang&#xff0c;文中的“我”是原文作者。 前一段时间&#xff0c;我一知识星球的球友问我这么一个问题&#xff0c;说他是某 985 应届生&#xff0c;拿到了 BAT 一家互联网大公司的 offer&#xff0c;但同时他还拿到了…