3.0、Hibernate-延迟加载 1

news2025/1/21 12:48:07

3.0、Hibernate-延迟加载 1

        Hibernate 延迟加载 也叫 惰性加载、懒加载;

        

        使用延迟加载可以提高程序运行效率,Java 程序 与 数据库交互的频次越低,程序运行的效率就越高,所以我们应该尽量减少 Java 程序 与 数据库的交互次数,Hibernate 延迟加载 就很好的做好了这一点;

        先来说一下没有延迟加载怎么操作 -> 客户 和 订单,当我们查询客户对象时,因为有级联设置,所以会将对应的订单信息一并查询出来,这样就需要发送两条 SQL 语句,分别查询 客户信息 和 订单信息。

        延迟加载的思路是 -> 当我们查询客户的时候,如果没有访问订单数据,就只发送一条 SQL 语句来查询客户信息,如果需要访问订单数据的时候,则发送两条 SQL;

        所以延迟加载可以看做是一种优化机制,根据具体的需求,自动选择要执行的 SQL 语句数量

接下来用代码演示 一对多 - 延迟加载 ->

第一步:用之前 1.0 里面创建好的素材就好,这里先测试 一对多 所以用到的是 customer 和 order 这两个 pojo 实体类,查询 customer 对 order 进行延迟加载,在 customer.hbm.xml 映射文件中进行设置,延迟加载默认开启;将lazy属性设置为 true ,不过这个lazy默认就是开启的 ->

<!--        orders是实体类Customer中的属性名,该属性是一个Order类的集合,所以对应表 order-->
        <set name="orders" table="orders" lazy="true">
<!--            这里配置一下主外键 cid -->
            <key column="cid"></key>
<!--            消费者和订单的关系是一对多,所以这里是 one-to-many,然后给set类型加一个对象,对象类型是Order-->
            <one-to-many class="com.hkl.pojo.Order"></one-to-many>
        </set>

第二步:在 test 文件夹下创建 Test4.java 文件去查询一下 customer ->

import com.hkl.pojo.Customer;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Test4 {
    public static void main(String[] args) {
        //        创建configuration
        Configuration configuration = new Configuration().configure();
//        获取sessionFactory
        SessionFactory sessionFactory = configuration.buildSessionFactory();
//        获取Session
        Session session = sessionFactory.openSession();

        Customer customer = session.get(Customer.class,42);
        System.out.println(customer);
        session.close();
    }
}

        运行之后我们会发现报了一个错误 -> StackOverflowError 栈溢出;这是因为 Customer 和 Order 两个 pojo 实体类中都有 toString() 方法而这两个方法中都相互调用了对方的一个对象 ,而在 Java 中栈的空间是有限的不断的去创建对象一定会导致栈溢出,如下->

//在 Customer.java pojo实体类中,有一个 Set 类型的集合类 Order
private Set<Order> orders;    

//在 Order.java pojo实体类中有一个Customer类型的对象 customer
private Customer customer;

解决方案 -> 将其中一个 pojo 实体类中的 toString() 方法去掉 或者 将其中一个 toString() 方法让他不要调用另一个 pojo 类的对象即可;成功查询 ->

 

这时候我们只是查询一张表 customer ,如果我们把 Test4.java 文件中的 ->

System.out.println(customer);

改为 ->

System.out.println(customer.getOrders());

可以发现有两条 SQL 语句,查询了两次 ->

        这个例子体现出了 Hibernate 延迟加载的作用,会自动的根据当前的需求来选择要查询的语句,如果你只需要查询主表的信息那么一条 SQL 语句就搞定,但是如果要把从表的数据能够带出来就会调用两条 SQL 语句;

但是如果我们把延迟加载关掉 -> lazy = "false"

<!--        orders是实体类Customer中的属性名,该属性是一个Order类的集合,所以对应表 order-->
        <set name="orders" table="orders" lazy="false">
<!--            这里配置一下主外键 cid -->
            <key column="cid"></key>
<!--            消费者和订单的关系是一对多,所以这里是 one-to-many,然后给set类型加一个对象,对象类型是Order-->
            <one-to-many class="com.hkl.pojo.Order"></one-to-many>
        </set>

再去只查询主表 customer 会发现还是有两条 SQL 语句 ->

这是因为我们把延迟加载关掉了,他就变成立刻加载了,只要查询主表就会把从表带出来~

lazy知识补充:

        这里再补充一点:lazy除了可以设置 true 和 false 之外,还可以设置 extra ,extra 是比 true 更加懒惰的一种加载方式,或者说是更加智能的一种加载方式,下面我们通过例子来演示一下 ->        

        我们测试一下 -> 先将 lazy 设置为 true 查询 Customer 对象,然后打印该对象对应的 orders 集合的长度;

        可以看到查询了两条 SQL 语句,并且打印出来 长度是 1 ;

        比如说我们有三条数据,他会先把这三条数据查询出来然后封装成三个对象,然后再把这三个对象装载到一个集合里面,之后将这个集合赋给我们的 customer,最后然后再从集合里面调用 Set;

        相当于先把对象装到集合里面然后再去判断集合的长度,这样其实是有点浪费我们资源的,因为我们只需要判断长度,我并不需要知道他具体的信息是什么;

然后将 lazy 设置为 extra,再跑一遍结果如下->

        这里我们只需要判断有几条数据就可以了,并不需要像之前那样将每条数据封装成对象,再把对象装载到集合里,再去判断集合的长度的一系列操作;

        与刚刚的语句相比较更为的方便、高效、合理;

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

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

相关文章

“ 总有个人会捡起 七零八落的你 “

把我所有最好的那些东西 给从来不曾抛弃我的人 所幸音频&#xff1a;00:0003:50 | 01 | 我想象过漂洋过海的冒险 向往过孤身一人的江湖 也憧憬过无拘无束的高飞 但是 越长大我越发现 家人在我生命中占据着不可或缺 | 02 | “怎么都不要我” 贺子秋说出来这句话的时候我…

【Python机器学习】隐马尔可夫模型讲解及在中文分词中的实战(附源码和数据集)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 隐马尔可夫模型&#xff08;HMM&#xff09;是关于时序的概率模型&#xff0c;它可用于标注等问题中 基本思想 假设一个盒子里可以装两个骰子&#xff0c;骰子的种类有四面的和六面的两种。现在进行猜骰子实验&#xff0c…

云原生安全系列3:5个 Kubernetes API 网络安全访问最佳实践

Kubernetes 中的 API 访问控制会经历三个步骤。首先&#xff0c;对请求进行身份验证&#xff0c;然后检查请求的有效授权&#xff0c;然后执行请求准入控制&#xff0c;最后授予访问权限。但在身份验证过程开始之前&#xff0c;确保正确配置网络访问控制和 TLS 连接应该是首要任…

SuperMap iPortal 对接postgis业务数据库(一):使用nodejs连接数据库并通过接口返回数据

前言 最近有很多人问SuperMap iPortal怎样对接自己的业务数据库&#xff0c;而目前SuperMap iPortal还没办法直接对接,但是可以通过11版本新增的低代码编辑器绕行实现.大致实现步骤如下&#xff1a; 1. 使用nodejs连接数据库并通过接口返回数据 2. 在大屏中请求接口数据并在图…

华为云解锁云原生数据库发展新动能

摘要&#xff1a;如流水般源源不断的数据都存放在哪里&#xff1f;云原生数据库到底是什么&#xff1f;企业基于云原生数据库如何随取随用&#xff0c;实现从 “上好云” 到 “用好云” 的跨越发展&#xff1f;本文分享自华为云社区《探秘・云新知丨华为云解锁云原生数据库发展…

地统计插值学习心得(一)

引言 当我们尝试使用克里金方法插值数据时,最常见的问题之一就是数据中存在极值或者说是异常值。极值是指与其他数据相比非常大或非常小的数据值。通常是由于监测设备故障或数据输入失误造成的,比如不小心删除了数据中的小数点。在进行插值之前,应手动纠正或删除这些错误数据…

非零基础自学Golang 第12章 接口与类型 12.4 空接口

非零基础自学Golang 文章目录非零基础自学Golang第12章 接口与类型12.4 空接口12.4.1 将值保存到空接口12.4.2 从空接口取值12.4.3 空接口的常见使用第12章 接口与类型 12.4 空接口 12.4.1 将值保存到空接口 空接口&#xff08;interface{}&#xff09;是Go语言中最特殊的接…

MD5算法:利用python进行md5 hash值的获取

MD5基本概念 MD5&#xff0c;即信息摘要算法&#xff0c;英文为MD5 Message-Digest Algorithm&#xff0c;是一种被广泛使用的密码散列函数&#xff0c;可以产生出一个128位&#xff08;16字节&#xff09;的散列值&#xff08;hash value&#xff09;&#xff0c;也叫散列值&…

Live800:不做背锅侠,在线客服系统有帮助

一个公司最牛的部门是哪个&#xff1f; 不同的公司可能有不同的答案&#xff0c;但要说公司哪个部门最憋屈&#xff0c;承接客户的炮火最多&#xff0c;那一定是客服部。因为无论是产品的质量、物流、使用出了问题&#xff0c;消费者的负向反馈都会轰向客服&#xff0c;而当客…

中低压分布式电源并网方案(RCL0923群调群控协同控制终端/RCL0923A分布式光伏逆变器数据采集器)方案

中低压分布式电源并网方案(RCL0923群调群控协同控制终端/RCL0923A分布式光伏逆变器数据采集器)方案 中低压分布式电源并网方案(RCL0923群调群控协同控制终端/分布式光伏逆变器数据采集器)方案 RCL0923分布式光伏电源群调群控协调控制终端/分布式光伏逆变器数据采集器 方案一…

Kotlin基本的语法学习

1.变量 在Kotlin中定义变量的方式和Java区别很大&#xff0c;在Java中如果想要定义一个变量&#xff0c;需要在变量前面声明这个变量的类型&#xff0c;比如说int a表示a是一个整型变量&#xff0c;String b表示b是一个字符串变量。而Kotlin中定义一个变量&#xff0c;只允许在…

操作系统:用C语言模拟先进先出的算法(FIFO)、最久未使用算法(LRU)、改进的Clock置换算法的命中率。

2.1 实验目的 通过请求页面式存储管理中页面置换算法设计&#xff0c;了解存储技术的特点&#xff0c;掌握请求页式存储管理的页面置换算法。 2.2 实验内容 用程序实现生产者——消费者问题&#xff0c;将指令序列转换为用户虚存中的请求调用页面流。 具体要求&#xff1a; …

以太坊的ecrecover预编译合约

1. 引言 前序博客&#xff1a; ECDSA VS Schnorr signature VS BLS signature ECDSA&#xff0c;全称为Elliptic curve Digital Signature Algorithm&#xff0c;采用Elliptic curve cryptography来实现的数字签名算法。 公私钥对(pk,P)(pk,P)(pk,P)&#xff0c;其中公钥Pp…

阿里云-数据仓库-全链路大数据开发治理平台-DataWorks的数字世界

一、前言 上文我讲到 阿里云-数据仓库-数据分析开发神器-ODPS &#xff0c;今天我带领大家一起走进神器的成长环境及它的数据世界。 二、 DataWorks是什么 DataWorks基于MaxCompute、Hologres、EMR、AnalyticDB、CDP等大数据引擎&#xff0c;为数据仓库、数据湖、湖仓一体等…

大数据-压缩与打包

一、gzip命令 1、选项参数 参数作用-c&#xff08;compress&#xff09;将压缩的数据输出到标准输出&#xff08;stdout&#xff09;上-d&#xff08;decompress&#xff09;解压缩-t&#xff08;test&#xff09;可以用来检验一个压缩文件的一致性&#xff0c;看看文件有无错…

艾美捷甘油比色测定试剂盒-简单,敏感,高效

艾美捷甘油比色测定试剂盒&#xff0c;利用双酶联反应系统来检测血清和血浆中的甘油的含量.最后用酶标仪在540nm处测吸光度值即可. 甘油是甘油三酯的骨架&#xff0c;是参与氧化和合成过程的能量代谢的重要中间体。甘油和游离脂肪酸循环水平的测量被认为反映了脂肪分解&#xf…

快应用的优势与劣势对比

2018年&#xff0c;“快应用”标准正式推出。快应用是九大手机厂商基于硬件平台共同推出的新型应用生态。用户无需下载安装&#xff0c;即点即用&#xff0c;享受原生应用的性能体验。 快应用框架深度集成进各厂商手机系统中&#xff0c;可以在操作系统层面实现用户需求与应用…

艾美捷甘油比色测定试剂盒基本参数和相关文献说明

背景&#xff1a; 哺乳动物中&#xff0c;甘油三脂主要储存在脂肪组织中&#xff0c;作为主要的能量储存仓库.当禁食阶段&#xff0c;存储在肝脏和脂肪组织中的甘油三酯被脂肪酶分解形成脂肪酸和甘油. 艾美捷甘油比色测定试剂盒基本参数&#xff1a; 中文名称&#xff1a;甘油…

dpdk中的librte_malloc库

dpdk中的librte_malloc库提供了能够分配任意大小内存的API。 该库的目标是提供类似malloc的函数从hugepage中分配内存&#xff0c;以及帮助应用程序移植。 通常情况下&#xff0c;这种类型的分配不应该在数据平面处理&#xff0c;因为其比基于内存池的分配更慢&#xff0c; …

网站被反诈中心DNS劫持解决教程

如果你的网站部分地区用户访问反馈访问不了&#xff0c;测试域名DNS被劫持到了127.0.0.1 或 0.0.0.0 可能是域名被墙了&#xff0c;或则被反诈中心拦截了&#xff0c;如果遇到该问题&#xff0c;需要检测单单被运营商拦截还是也有被反诈中心拦截。 排查过程: 可以把问题域名通过…