Hibernate深入之get()与load()懒加载

    前面讲过get和load,一个是直接加载,并不是直接去数据库查询,如果缓存里有,首先到缓存里找,缓存分为一级缓存和二级缓存,首先到一级缓存中查找;

    如果在session关闭之后进行获取类的名字之类的属性,依然会获取到,例:

    Order od = (Order) session.get(Order.class, 1);

    通过get获取的Order类是一个持久化类,如果session关闭之后进行获取,od.getName,它就会变成托管状态,但是这个对象还是有的,所以没事;

    另一个是懒加载,他不会直接进行操作,就是除了获取id(标识符)和类.class时,获取其他的类属性都会进行操作,

    例:

    Account  acc=(Account)session.load(Account.class,new Long(1));    //返回一个代理对象

    System.out.println(acc.getId);

    System.out.prontln(acc.getLonginName());

    这里的1是一个代理对象,如果只获取他的id,则不会加载,不会出现select语句,只有获取除他和本身之外才会进行查找;否则访问的只是他的代理对象而已;如果需要取消懒加载,就只需要在你想获取的类属性的映射文件的<class name=”” table=”” lazy=”false”>把他改为false就可以了,这样懒加载就取消了,这里只对load管用,对get()毫无影响;

    如果把他System.out.prontln(acc.getLonginName());放在session关闭之后,则会出现错误,因为这里只产生了一个代理对象,没有真正去查,把session关之后,他会去查数据库,要发出sql语句,因为发出sql语句需要在session里面,所以session关了之后,就不能使用了;

    接下来说一说他们之间的区别:

    延迟加载的过程:通过代理(Proxy)机制来实现延迟加载。Hibernate从数据库获取某一个对象数据时、获取某一个对象的集合属性值时,或获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据(除标识符外),Hibernate并不从数据库加载真正的数据,而只是为该对象创建一个代理对象来代表这个对象,这个对象上的所有属性都为默认值;只有在真正需要使用该对象的数据时才创建这个真正的对象,真正从数据库中加载它的数据。

    如果只是访问对象标示符属性,就没有必要初始化代码。

    Account  acc=(Account)session.load(Account.class,new Long(1));    //返回一个代理对象

    Order order=new Order();

    order.setCreateTime(new Date());

    order.setAccount(acc);

    Session.save(order);

    在这只需要Account实例来创建一个新的Order订单对象,当调用session.save(order)时,也只需要Account的主标示符值作为外键保存到订单表的对应字段中。这样就少执行一条select语句,从而提高查询效率。

    Hibernate中默认采用延迟加载的情况主要有以下几种:

    当调用Session上的load()方法加载一个实体时,会采用延迟加载。

    当Session加载某个实体时,会对这个实体中的集合属性值采用延迟加载。(one-to-many)

    例:当Client这个类里具有集合属性,

        Client client = (Client) session.get(Client.class, 4);

        System.out.println(client.getName());

        获取他的名字,你会发现只有一条sql语句,因为采用了延迟加载,所以如果想  

        取消,就在该映射文件下<set>里面把lazy改成false;

    当Session加载某个实体时,会对这个实体所单端关联(one-to-one,  many-to-one)的另一个实体对象采用延迟加载。

    能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性(getId和getClass除外)hibernate会初始化这些代理,或用Hibernate.initialize(proxy)来初始化代理对象;当相关联的session关闭后,再访问懒加载的对象将出现异常。

2、 关闭延迟加载

    在加载单个实体时,如果不需要延迟加载,就可以使用session的get()方法。

    当Session加载某个实体时,不需要对这个实体中的集合属性值延迟加载,而是要立即加载。这时可以在映射文件中针对 这个集合属性的配置元素(<set>,<bag>,<list>…)添加属性lazy=“false”。

    当Session加载某个实体时,不需要对这个实体所单端关联的另一个实体对象延迟加载,就可以在映射文件中对这个单端关联的配置元素(<one-to-one>,<many-to-one> )添加属性lazy=“false”。

    注意:one-to-one不能有constrained=true

转载于:https://www.cnblogs.com/pengw/p/3983167.html

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

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

相关文章

Openssl搭建私有CA认证

概述CA英文全称Certification Authority&#xff0c;即数字证书认机构。从广义上来说&#xff0c;CA是负责发放和管理数字证书的权威机构&#xff0c;并作为用户数字认证中受信任的第三方&#xff0c;承担公钥体系&#xff08;PKI&#xff09;中公钥的合法性检验的责任&#xf…

python程序 爱意_[Python]快学学怎么Python爬一段情书送女朋友吧

如果能够时不时做个小程序爬一点情书送给自己的女朋友&#xff0c;女朋友会怎么样呢&#xff1f; 我想肯定还是会很开心的吧&#xff0c;而且一般女生也都不太懂编程&#xff0c;见到这种黑科技的东西&#xff0c;博主觉得&#xff0c;简直要连着妹子宿舍里面的一群小女生都给变…

提升树算法总结(一)

本文是综合了之前的以往多个笔记汇总而成&#xff0c;内容较长。感兴趣的建议收藏用到时随时翻阅内容包含&#xff1a; 若有遗漏错误之处请反馈修改&#xff0c;感激不尽 一、Boosting基本概念 二、前向分步加法模型1. 加法模型2. 前向分步算法 三、AdaBoost1. 算法解析2. 模…

Android之Launcher分析和修改4——初始化加载数据

上面一篇文章说了Launcher是如何被启动的&#xff0c;Launcher启动的过程主要是加载界面数据然后显示出来&#xff0c; 界面数据都是系统APP有关的数据&#xff0c;都是从Launcher的数据库读取&#xff0c;下面我们详细分析Launcher如何加载数据。 在Launcher.java的onCreate()…

图像处理技术之分辨率与压缩

一 图像分辨率数码图像有两大类&#xff0c;一类是矢量图&#xff0c;也叫向量图&#xff1b;另一类是点阵图&#xff0c;也叫位图。矢量图比较简单&#xff0c;它是由大量数学方程式创建的&#xff0c;其图形是由线条和填充颜色的块面构成的&#xff0c;而不是由像素组成的&am…

“一次编写,随处运行” Intel HTML5技术研讨会

HTML5 是一种开放标准。通过使用此标准&#xff0c;开发人员只需编写一次程序&#xff0c;即可在任何地方运行。 这一跨平台方法能够显著增加开发人员的总体潜在受众&#xff0c;同时在不同屏幕尺寸上为用户带来更一致的体验。因此&#xff0c;HTML5 是应用程序开发领域的未来趋…

当代年轻人,都有些不成文的规定?

全世界只有3.14 % 的人关注了爆炸吧知识面对海量信息&#xff0c;我们不可能有时间去一一筛选&#xff0c;导致我们看到的总是局部。包括公众号&#xff0c;看似可以随便关注&#xff0c;但是你的选择其实是有限空间的。你可以关注更多资讯、干货十足的公号主动和别人分享有趣的…

flash文件制作笔记

在uboot串口台输入printenv 可以分区以及其他信息&#xff0c;如下 hisilicon # printenv bootdelay1baudrate115200ethaddr00:00:23:34:45:66bootfile"uImage"UPDATEnetupdate JVS-HI3518ES-8188 0x83FFF000 0x780000 0x80000filesize1B0000fileaddr82000000netmask…

未检测到正确安装的网络适配器_电脑网络适配器有感叹号怎么解决?

今天有位女性乎友问&#xff1a;我家的电脑之前一直没装宽带&#xff0c;主要是家人怕影响学习&#xff0c;不过上周就涨了&#xff0c;电脑终于连上网线&#xff0c;但没办法上网&#xff0c;还发现电脑设备管理器中网络适配器出现黄色感叹号。对于电脑的网络适配器感叹号问题…

Android之Launcher分析和修改5——HotSeat分析

今天主要是分析一下Launcher里面的快捷方式导航条——HotSeat&#xff0c;一般我们使用手机底下都会有这个导航条&#xff0c;但是如果4.0的Launcher放到平板电脑里面运行&#xff0c;默认是没有HotSeat的&#xff0c;刚好我这里的运行环境类似平板&#xff0c;系统默认把HotSe…

使用Spectre.Console创建漂亮的控制台应用程序

前言你是否厌倦了控制台应用程序默认的简陋界面&#xff1f;这时&#xff0c;你可以试试引用Nuget包Spectre.Console。打印使用帮助首先&#xff0c;我们可以设置控制台应用程序可以执行的命令&#xff1a;static async Task<int> Main(string[] args) {var app new Com…

Boosting集合算法详解(一)

本文是关于聚类算法的第二篇K-means&#xff0c;感兴趣的同学可以前往http://ihoge.cn/2018/clustering.html 阅读完整版。 二、K-means 1. 算法步骤 <1> 选择KK个点作为初始质心 <2> Repeat: <3> 将每个点指派到最近的质心,形成K" role="pre…

一款不错的网站压力测试工具webbench

webbench最多可以模拟3万个并发连接去测试网站的负载能力  1、适用系统&#xff1a;Linux  2、编译安装&#xff1a; wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gztar zxvf webbench-1.5.tar.gzcd webbench-1.5make && make installUnbun…

WindowsPhone8可缩放图片控件的实现

xaml中添加: <ViewportControl x:Name"viewport" DoubleTap"OnDoubleTap"ManipulationStarted"OnManipulationStarted" ManipulationDelta"OnManipulationDelta" ManipulationCompleted"OnManipulationCompleted" Viewpo…

python导入自定义模块_Python3 导入自定义的包

什么是包&#xff1f; 要想知道什么是包&#xff0c;得先了解一下模块的概念。 模块是一个包含所有你定义的函数和变量的文件&#xff0c;其后缀名是 .py。模块可以被别的程序引入&#xff0c;以使用该模块中的函数等功能。 知道了模块&#xff0c;那紧接着看看包&#xff1a; …

Android之ComponentName的用法

ComponentName(组件名称)是用来打开其他应用程序中的Activity或服务的、 ComponentName,顾名思义,就是组件名称,通过调用Intent中的setComponent方法,我们可以打开另外一个应用中的Activity或者服务。 实例化一个ComponentName需要两个参数,第一个参数是要启动应用的包…

Linux入门之进程管理(4)之进程与文件

Linux入门之进程管理(4)之进程与文件前面使用进程相关命令管理工具都是根据进程编号或者进程名称及其其它属性信息来查看和处理相关进程的&#xff0c;但是在某些情况下&#xff0c;想要查看某个文件或者某个设备被哪些进程所使用&#xff0c;使用ps、pgrep等命令查询的是不够准…

巧用Hive自带函数进行多字段分别去重计数统计

巧用Hive自带函数进行多字段分别去重计数统计 1-group by 和 distinct 大前提&#xff1a;大表统计能使用group by就不要使用distinct&#xff01;&#xff01; 尤其是在数据量非常大的时候&#xff0c;distinct会将所有的统计信息加载到一个reducer里取执行&#xff0c;这就是…

初识MASA Blazor

MASA Blazor是一个Blazor的UI组件库。就像大家写前端熟知的Bootstrap, Ant Design一样。MASA Blazor官网地址&#xff1a;https://blazor.masastack.comMASA Blazor Github地址&#xff1a;https://github.com/BlazorComponent/MASA.BlazorMASA Blazor Pro演示地址&#xff1a;…