Hibernate的检索策略(lazy、fetch、batch-size)
Hibernate的检索策略包括立即检索和延迟检索,可以在配置文件中通过对lazy、fetch、batch-size属性的设置来进行控制。一对多、多对多、多对一和一对一关系下的不同检索策略将影响对数据库访问的效率。
检索策略
- 立即检索,立即加载检索方法指定的对象
- 延迟检索,延迟加载检索方法指定的对象,在使用具体属性值时,才进行加载(这个时候会执行查询语句)
检索策略使用场景
- 如果加载对象是为了访问他的属性,则使用立即加载
- 如果加载对象目的是为了获得他的应用,则可以使用延迟加载
检索策略属性
以一个老师有多个学生,一对多的关系为例
- lazy: 主要决定students集合被初始化的时机. 即到底是在加载 Teacher对象时就被初始化, 还是在程序访问 students 集合时被初始化
- fetch: 取值为 “select” 或 “subselect” 时, 决定初始化 students的查询语句的形式; 若取值为”join”, 则决定 students 集合被初始化的时机,若把 fetch 设置为 “join”, lazy 属性将被忽略
- batch-size:批量检索能减少 SELECT 语句的数目, 提高延迟检索或立即检索的运行性能
一对多和多对多的检索策略,lazy和fetch取值对应策略
- lazy=true ——– fatch=默认 ——– 采用延迟检索
- lazy=false ——– fatch=默认 ——– 采用立即检索
- lazy=extra ——– fatch=默认 ——– 采用加强延迟检索(延迟对象集合初始化时机)
- lazy=true/false/extra ——– fatch=默认 ——– 根据lazy决定执行检索策略
- lazy=true/false/extra ——– fatch=subselect ——– 根据lazy决定执行检索策略
- lazy=默认 ——– fatch=join ——– 采用迫切左外连接策略
多对一和一对一的检索策略,lazy和fetch取值对应策略
- lazy=proxy ——– fetch=默认 ——– 采用延迟检索
- lazy=non-proxy ——– fetch=默认 ——– 采用无代理延迟检索(需要增强持久化类的字节码才能实现)
- lazy=false ——– fetch=默认 ——– 采用立即检索
- lazy=默认 ——– fetch=join ——– 采用迫切左外连接策略(比立即检索用更少select语句)
实例验证
以下以学生与老师,多对多的关系为例
- 实体类
学生package test.hibernate.spring.model;import java.util.HashSet; import java.util.Set;public class Student {private int id;private String name;private Set<Teacher> teachers=new HashSet<>();public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<Teacher> getTeachers() {return teachers;}public void setTeachers(Set<Teacher> teachers) {this.teachers = teachers;}public Student() {super();}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + "]";}}
老师
package test.hibernate.spring.model;import java.util.HashSet; import java.util.Set;public class Teacher {private int id;private String name;private Set<Student> students=new HashSet<>();public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<Student> getStudents() {return students;}public void setStudents(Set<Student> students) {this.students = students;}public Teacher() {super();}@Overridepublic String toString() {return "Teacher [id=" + id + ", name=" + name + "]";}}
- 配置文件
Student.hbm.xml<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping><!-- 类级加载配置 lazy默认为true--><class name="test.hibernate.spring.model.Student" table="s_students" ><id name="id" type="int"><column name="s_id" /><generator class="native" /></id><property name="name" type="java.lang.String"><column name="s_name" /></property><!-- 集合加载配置,当lazy="true"时不会检索,fetch="join"时,lazy属性无效,将会使用left outer join进行检索,减少对数据库的访问次数--><!-- batch-size是设置每次访问数据库时检索的数量,默认是1,当值设大则会减少对数据库的访问次数,但设得过大也会加大内存的负担,需根据服务器的硬件配置来设置 --><set name="teachers" table="t_students_teachers" inverse="true" lazy="false" fetch="join" batch-size="3"><key><column name="s_id" /></key><many-to-many class="test.hibernate.spring.model.Teacher" column="t_id"></many-to-many></set></class> </hibernate-mapping>
Teacher.hbm.xml<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping><class name="test.hibernate.spring.model.Teacher" table="t_teachers"><id name="id" type="int"><column name="t_id" /><generator class="native" /></id><property name="name" type="java.lang.String"><column name="t_name" /></property><set name="students" table="t_students_teachers" inverse="false" fetch="subselect" batch-size="3"><key><column name="t_id" /></key><many-to-many class="test.hibernate.spring.model.Student" column="s_id"></many-to-many></set></class> </hibernate-mapping>
- 测试
/**
*Description:
*author: ljd
*@date 2024年7月30日
*@version 1.0
*/
package test.hibernate.spring;import java.util.List;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import test.hibernate.spring.model.Student;public class TestSession {SessionFactory sessionFactory = null;Session session = null;Transaction ts = null;@Beforepublic void beforP() {System.out.println("begin....");/* hibernate规定,所有的配置或服务,必须配置或注册到一个服务注册类中 */Configuration configuration = new Configuration().configure();ServiceRegistry sr = configuration.getStandardServiceRegistryBuilder().build();/* 从注册类中获得工厂类 */sessionFactory = new MetadataSources(sr).buildMetadata().buildSessionFactory();/* 通过工厂类开启Session */session = sessionFactory.openSession();/* 开启事务 */ts = session.beginTransaction();}@Afterpublic void endP() {System.out.println("end....");/* 提交事务 */ts.commit();/* 关闭Session */session.close();/* 关闭工厂 */sessionFactory.close();}// @Testpublic void testGet() {// 使用get时, class标签中lazy值不管是true还是false都会直接加载,当set标签// 中fetch="join"时,会在get时使用左join将其集体一起检索出来,访问数据库只需一次// fetch值是其它时则需要访两次Student s = session.get(Student.class, 1);System.out.println(s.getTeachers().size());}// @Testpublic void testLoad() {// 使用load时, class标签中lazy是true时不会直接加载,是false时会直接加载Student s = session.load(Student.class, 1);// 类中的集合是否直接检索,取决于类是否是直接加载,如果类是懒加载,那么集合将是在访问时才会检索System.out.println(s.getTeachers().size());}@Testpublic void testBatchSize() {String sql = "from Student";@SuppressWarnings("unchecked")Query<Student> query = session.createQuery(sql);List<Student> students = query.list();for (Student s : students) {System.out.println(s.getTeachers().size());System.out.println("-----------------------------");}}
}
相关文章:
Hibernate的检索策略(lazy、fetch、batch-size)
Hibernate的检索策略包括立即检索和延迟检索,可以在配置文件中通过对lazy、fetch、batch-size属性的设置来进行控制。一对多、多对多、多对一和一对一关系下的不同检索策略将影响对数据库访问的效率。 检索策略 立即检索,立即加载检索方法指定的对象延…...
算法训练(leetcode)第四十六天 | 110. 字符串接龙、105. 有向图的完全可达性、106. 岛屿的周长
刷题记录 *110. 字符串接龙105. 有向图的完全可达性邻接矩阵邻接表 106. 岛屿的周长深搜简化代码 *110. 字符串接龙 题目地址 使用广搜。 本题相当于求最短路径,因此使用广搜。如何应用广搜是一个难点,因为题目给的是字符串而非图的表示(邻…...
自定义Mybatis-Plus分布式ID生成器(解决ID长度超过JavaScript整数安全范围问题)
自定义MyBatis-Plus分布式ID生成器(解决ID长度超过JavaScript整数安全范围问题) 版本 MyBatis-Plus 3.4.1 问题 MyBatis-Plus 默认生成的是 64bit 长整型,而 JS 的 Number 类型精度最高只有 53bit,如果以 Long 类型 ID 和前端…...

2024剪辑神器盘点:四大热门剪辑软件推荐!
亲爱的朋友们,想要制作出精彩短视频,却苦于找不到合适的剪辑工具?别担心,今天要向大家推荐几款剪辑软件,它们能帮助大家更好地完成视频创作! 福昕视频剪辑 链接:www.pdf365.cn/foxit-clip/ 对…...

sql注入靶场sqli-labs常见sql注入漏洞详解
目录 sqli-labs-less1 1.less1普通解法 1.在url里面填写不同的值,返回的内容也不同,证明,数值是进入数据库进行比对了的(可以被注入) 2.判断最终执行的sql语句的后面还有内容吗,并且能够判断是字符型的拼接…...

[C++] 模板进阶:特化与编译链接全解析
文章目录 非类型模板类型形参非类型模板参数代码示例 **模板的特化**为什么要有模板的特化函数模板特化使用场景与示例函数模板特化的实现细节 类模板特化全特化示例 偏特化部分优化通过进一步限制模板参数进行特化偏特化为指针类型示例:偏特化为引用类型示例&#…...
oracle-备份
1、逻辑备份(exp) /ljbb/oracle/o19c/bin/exp hr/hr tablesJOBS file/ljbb/bak/system.sql log/ljbb/bak/ststem.log query\where deptno30\ buffer100000000 hr/hr 用户/密码 tablesJOBS 表名:JOBS file/ljbb/bak/system.sql 备份文件路径 log/ljbb/ba…...
oracle 并行parallel的插入insert用法
在Oracle数据库中,INSERT 语句确实可以使用 Parallel(并行)功能。通过并行插入,可以在插入数据时同时利用多个并行操作进程来执行插入操作,从而显著提高插入操作的速度和效率。这对于需要处理大量数据插入的场景尤为有…...
夜莺监控使用指南
夜莺监控使用指南 本文用于解决在部署和应用夜莺监控中遇到的一些问题以及官方文档缺失的某些步骤可能会遇到的坑。 安装过程 我使用是NightingaleCategrafPrometheus的架构。 Nightingale安装文档:https://flashcat.cloud/docs/content/flashcat-monitor/night…...

MySQLDM笔记-查询库中是否存在列出的表名及查询库中列出的不存在的表名
如下表名: aaa,bb,cc,ccs,dds,csdf,csdfs,sdfa,werwe,csdfsd 在MySQL库中,查询哪些表名在数据库中 SELECT table_name FROM information_schema.tables WHERE table_schema your_database_name_here AND table_name IN (aaa, bb, cc, ccs, dds, csdf…...

第9天 xxl-job
使用xxl-job需要建表 引入依赖 添加配置 Bean public XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor new XxlJobSpringExecutor();xxlJo…...
C++字符串<string>库
一:string及其标准库 C中使用string类需要添加<string>库。 string初始化: string str1 "Hello"; string str2; str2 "World"; string str3 str1 str2; string在变量的声明以及初始化与C语言的char类字符串一致。但是str…...

智能分析,安全无忧:AI视频分析技术在安全生产中的深度应用
在当今快速发展的科技时代,视频智能分析技术(Intelligent Video Analysis,简称IV)已经成为提升安全生产水平的重要手段。这一技术通过计算机图像视觉分析技术,实现了对场景中目标的自动识别和追踪,有效提升…...

02 Canal的安装使用
1 下载Canal Cannal下载地址如下:https://github.com/alibaba/canal/releases,这里选择Canal 1.1.4版本下载。2 上传解压 #首先创建目录 “/software/canal” [rootnode3 ~]# mkdir -p /software/canal#将Canal安装包解压到创建的canal目录中 [rootnode3 ~]# tar …...

【网络安全】玲珑安全第四期
鉴于玲珑安全漏洞挖掘前三期课程取得的优异成绩和获得的强烈反响,我们决定启动玲珑安全第四期漏洞挖掘培训计划。 文章目录 往期学员收获基础学员报喜(部分)课程反馈第四期课程课程内容免费课程往期学员收获 第一期课程总结及学员收获:->点我查看第一期学员收获<- …...

【工具】图片背景移除界面 UI 源码
移除图片背景的UI 照片背景移除和填充颜色的用户界面 仓库地址:https://github.com/MengWoods/remove-background-ui/tree/main 介绍 该项目提供了一个基于 removebg 库的用户界面,用于从输入的照片中移除背景,并用不同的颜色填充背景。 …...

CentOS linux 安装openssl(openssl拒绝服务漏洞【CVE-2022-0778】解决)
一、安装 1.下载相关openssl包 下载地址: https://www.openssl.org/source/ 2.将下载好的压缩包放到 /app/server/nginx 路径下(根据自己实际需求定义) 3.切换至该路径 cd /app/server/nginx4.压缩包解压 压缩包解压 :tar -…...

假如有一个嵌套集合,怎么通过stream流将集合放到一个集合之中?
假如有一个嵌套集合,怎么通过stream流将集合放到一个集合之中? 问题解释:你有一个嵌套的集合,想要通过 Stream 流的方式将其中嵌套的集合放到一个新的集合中。可以使用 flatMap 方法来实现。这种方法非常适合处理嵌套集合的情况。…...
flutter doctor出现 Unable to find bundled Java version
在安装flutter时执行flutter doctor时出现了如下错误: [!] Android Studio (version 2022.1) ✗ Unable to find bundled Java version. 解决办法 检查下Applications/Android Studio.app/Contents目录下有没有jre文件夹,如果没有则创建一个&…...
Linux系统修改root密码
疑难杂症篇(十六)--虚拟机出现“The system is running in low-graphics mode“问题的解决方案_the system is running in low graphic-CSDN博客...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...