Hibernate一对一,一对多懒加载的要求

【SSH三大框架】Hibernate基础第十二篇:load()懒加载分析以及一对一、一对多、多对一、多对多懒加载的分析 一、懒加载的定义: 懒加载:在WEB应用程序中,经常会需要查询数据库,系统的响应速度在很大程度上是与数据库交互的响应。因此,如果能够优化与数据库的交互速度,则能够大大提高WEB应用的响应速度。 例如:当有一个Student类和一个Teacher类。当我们加载一个学生的所有信息,包括:学号,姓名等属性后,此时Student类中的Teacher类型的属性为null,当我们需要知道这个Student 阅读详情
 

懒加载要求Domain对象不能是final的,因为Hibernate需要生成一个继承自该Domain对象的类来实现懒加载。懒加载主要有三种:

1. 对象的懒加载

2. 关联集合的懒加载

3. 对象属性的懒加载

对象的懒加载

对象的懒加载就是在映射文件的class标签中设置lazy属性为true,这时,如果用session.load方法获取这个对象的话,Hibernate只返回一个代理对象,而不是真的去查询数据库,等到真正用到这个对象的时候,Hibernate才会去查询数据库。

关联集合的懒加载

关联集合的懒加载有多种:

1. 一对一映射懒加载

在一对一映射中,查询主对象时,Hibernate是不进行懒加载的,即使在映射文件中设置了主对象的从对象的lazy属性为proxy。在查询从对象时,必须要满足三个条件才能实现懒加载:

(1)从对象的映射文件中一对一映射的lazy属性不能设置成false;

(2)从对象的映射文件中一对一映射的constrained属性要设置成true;

(3)从对象的映射文件中一对一映射的fetch属性要设置成select。

第一条是设置是否采用懒加载,设置成false当然就不能实现懒加载了,可以设置成proxy和no-proxy两种;constrained属性设置成true是为了建立从对象表主键与主对象主键的外键关系的。如果这个属性设置成false,那么数据库里就不能保证主对象表里一定有一条记录与从对象表里的记录相对应,Hibernate也就不知道从对象里的主对象属性是应该赋成null还是赋成一个代理对象,所以就只能把主对象的记录也查询一下才能确认,这样就无法应用懒加裁了,这也是查询主对象时无法应用懒加载的原因;fetch属性可以设置成select和join两种,select是指查询主对象是通过另一条select语句去查询。如果设置成join,也就是说在取从对象的时候会inner join一下主对象,如果是这样的话,Hibernate就会直接把主对象信息取出来,自然也不需要懒加载了。

2. 一对多映射懒加载

一对多映射时分两种情况,一是查询一对象时的懒加载;二是查询多对象时的懒加载。

先说查询多对象时的懒加载。不像一对一映射查询主对象,默认时查询一个多对象时Hibernate也是会采用懒加载的。<many-to-one>标签需要两个属性设置,一是lazy不能设置成false;二是fetch不能设置为join。道理与前面一样。而这两个属性的默认值lazy是proxy、fetch是select,所以默认是进行懒加载的。

查询一对象时,默认也是懒加载的。这回设置属性应该是在集合标签里,而不是<one-to-many>标签里。并且lazy的值可以设置成true、false和extra三种,而不是之前的false、proxy和no-proxy三种。extra一种比较聪明的懒加载策略,如果调用集合的size/contains等方法的时候,hibernate并不会去加载整个集合的数据,而是发出一条适当的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据。若要应用懒加载,应该设置lazy属性为true或extra;并且fetch属性要设置成select。

3. 多对多映射懒加载

多对多映射的懒加载与一对多映射懒加载在集合标签上的设置是相似的,lazy属性也有true、false和extra三个选项。

对象属性的懒加载

Hibernate还支持对象属性的懒加载。应用的情况比较少,而且应该在设计上避免出现这种情况。

hbernate帮助文档(中文版) hibernate一份不错的文档,比较适合开始学习或者不熟练hibernate的朋友 立即下载

相关推荐

hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

主要介绍了hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法,需要的朋友可以参考下

Hibernate @OneToOne懒加载实现解决方案

在hibernate注解(三)中,我提高过一对一(@OneToOne)懒加载失效的问题。虽然给出了解决方法,但并没有给出完整的解决方案。今天我专门针对该问题进行讨论。至于懒加载失效的原因,在之前的文章中已经我已经叙述过了,就不再重复了,不明白的可以去看看。

鹏霄万里展雄飞 2万+

java爬虫(爬取银行理财数据)

import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; imp

ROCK 2490

hibernate的一对多关系与懒加载问题

1. 什么是关联(association) 1.1 关联指的是类之间的引用关系。如果类A与类B关联,那么被引用的类B将被定义为类A的属性。例如: class B{ private String name; private List<A> bs = new arraylist(); } public class A{ private B b = ne...

xieminglu的博客 795

毕业论文管理系统的设计与实现

毕业论文工作是高等学校本科培养阶段的一个重要环节。目前论文管理工作存在着许多问题,例如人工管理极为不便;学生对论文所要撰写的内容并不十分了解,与指导老师的沟通非常不便;老师的指导监督也很难完全到位;手工评审的效率低等。而现有的一些毕业论文信息管理或答辩评审系统只是实现了部分网上交流和评审管理的功能,在答辩评审的自测和项目指标权重等方面都存在着一定的不足。因此,本文设计的毕业论文管理系统采用B/S模式开发。其中,Browser层使用JSP技术开发;

wqq_992250277的博客 3181

ESP32天线阵列实现Wi-Fi空间成像与无直视定位

Wi-Fi信道状态信息(CSI)是OFDM系统中表征多径传播特性的基础物理层参数,其复数值包含幅度与相位,可反映无线环境的空间特征。基于CSI的射频感知技术,通过提取子载波级信道响应,结合阵列信号处理,实现到达角(AoA)估计与深度映射,本质是将通信链路重构为空间域传感器。该技术无需专用雷达硬件,具备低成本、被动式、隐私友好等工程优势,在室内定位、行为识别、仓储导航等场景具有广泛落地价值。本文聚焦ESP32平台,详解多芯片相位同步、CSI零拷贝采集、嵌入式MUSIC算法及信道图谱轻量化部署等关键实现。

weixin_30632267的博客 236

hibernate一对一懒加载

我们都知道hibernate有延迟加载机制,这样做可以使程序和数据库的交互尽量延迟,直到执行sql或hql命令的时候,也就是说程序不会立即访问数据库,也是由于这个原因有的时候我们会遇到懒加载异常。因为这个时候session已经关闭了,我们就不能访问数据库了。解决的办法有2种: 1.使用Hibernate.initialize(要访问的对象); 2.在映射文件中配置lazy=“false” ...

java开发指南博客 【转载】 191

麒麟V10系统命令实战指南:从入门到精通

本文为麒麟V10操作系统用户提供了一份从入门到精通的命令行实战指南。内容涵盖文件管理、进程监控、网络诊断、文本处理及系统管理等核心场景,旨在帮助用户转变思维,掌握高效解决实际问题的系统命令技巧,从而提升在麒麟V10环境下的运维与工作效率。

sat99的博客 594

hibernate一对多注解懒加载失效问题

在House类里有关联HouseInfo,设置了懒加载 但是页面ajax返回还是有HouseInfos的数据。 经排查,问题出在controller这边: @response注解启用jackson框架对House进行解析 然后调用了每个属性的get方法,自然houseInfos的懒加载就失效了 解决方法,给houseInfos字段加上@JsonIgnore注解忽略json解...

山间明月江上清风的专栏 1723

Vue - 在纯 HTML 普通项目中实现组件化,让原生 html 项目支持引入 *.vue 组件 / 组件与组件间的互相引用等,完美解决了引入组件出现的跨域问题(保姆级详细教程,完整示例源码及插件)

html中使用vue组件,在HTML页面中引入vue组件,HTML界面利用http-vue-loader.js以组件方式引入vue文件,使用http-vue-loader引入组件出现报错,在html页面使用http-vue-loader插件引入组件报跨域错误,如何解决http-vue-loader引用组件时出现跨域问题,纯html原生web项目引入vue后如何实现组件引入,使用http-vue-loader插件控制台报错跨域,http-vue-loader跨域怎么办官方文档,html页面如何引入.vu

🏆 前端领域优质创作者 3904

Python全栈入门到实战【JavaScript篇 15】async/await与Fetch API,打通前后端数据通道

Fetch API是浏览器内置的现代HTTP请求接口,用于向服务器发送请求并获取响应。它是(XHR)的替代品。学习Fetch的目标非常明确——用JS从后端API获取数据,并渲染到前端页面。这标志着前后端数据通道的打通,是实现全栈开发的核心技能。try {// 等待Promiseconst parallel = await Promise.all([ // 并行等待]);

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1977

Hibernate懒加载解析

Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了。 我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库。

雪狼小记 1万+

CANbus收发器ADM3053BRWZ-REEL7应用原理图设计

ADM3053 在 CAN 协议控制器与物理层总线之间创建一个 完全隔离的接口。该器件具有限流和热关断特性,可防止输出短路。额定温 度范围为工业温度范围,提供 20 引脚、宽体 SOIC 封装。该器件采用 5 V 单电源供电, 提供完全隔离的 CAN 解决方案。ADM3053 是一款隔离式控制器区域网络 (CAN) 物理层收 发器,集成隔离 DC/DC 转换器,符合 ISO 11898 标准。该器件采用 ADI 公司的。Coupler® 技术,将双通道隔离器、 CAN 收发器和 ADI 公司的。

zhusl6688的博客 1235

Hibernate懒加载分析

1 session.Load懒加载 之前在介绍Hibernate几个方法的时候,已经提到了这个load方法 当我们从脱管态的对象查询的时候,返回的不是查询数据库的对象,而是返回的是一个代理对象,hibernate没有去查询数据库,并报了一个LazyInitializalationException异常 那返回代理对象到底是个什么对象呢 根据测试: User user=

咖啡 493

【目标检测】全局上下文感知的详解

目标检测中的全局上下文感知(Global Context Awareness)​是指模型在定位和识别目标时,能够有效利用图像中全局或大范围的上下文信息(如场景语义、目标间关系、空间布局等),而不仅仅依赖局部特征。这种能力显著提升了检测的鲁棒性,尤其是在复杂场景(如遮挡、小目标、密集目标)中表现突出。

浩瀚之水的专栏 643

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

hibernate的懒加载和查询

1:hibernate的懒加载(通过asm和cglib包实现)代理对象实现2:单个对象的查询   总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;   而对于get方法,hibernate一定要获取到真实的数据,否则返回null。get()方法与load()方法的区别就

sutku的专栏 3073

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

hibernate懒加载原理

懒加载的意思是查询的时候不会立刻访问数据库,而返回的是代理对象,当真正去使用对象字段的时候才会访问数据库。 load(Object, Serializable):前提实体类不能是final的。根据id查询 。查询返回的是代理对象,不会立刻访问数据库,是懒加载的。当真正去使用对象的时候才会访问数据库。 用load的时候会发现不会打印出查询语句,而使用get的时候会打印出查询语句。 使用load时

写博客只为学习 637

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

load方法的懒加载及原理

load方法的懒加载及原理 load()方法会返回一个代理对象,只有访问该对象属性的的时候才会真正的去访问数据库,这样就可以提高效率了 如果要获取真正对象可以对其初始化 Hibernate.initialize(test); 1 一对一 懒加载 一对一查询主对象,是要关联到从对象表 但是如果查询从对象,那么就不会有关系的 2 一对多 懒加载 部门和员工 假如我们要获取

lzz360的专栏 7087

Hibernate 懒加载

懒加载的意思是查询的时候不会立刻访问数据库,而返回的是代理对象,当真正去使用对象的时候才会访问数据库。   load(Object, Serializable):根据id查询 。查询返回的是代理对象,不会立刻访问数据库,是懒加载的。当真正去使用对象的时候才会访问数据库。 用load的时候会发现不会打印出查询语句,而使用get的时候会打印出查询语句。 使用load时如果在session关闭之...

wangjinyong的博客 102

懒加载

初识懒加载:懒加载是指程序推迟访问数据库,这样做可以保证有时候不必要的访问数据库,因为访问一次数据库是比较耗时的。 1) Load()方法的懒加载:如果在session关闭之前都没有对数据库进行访问或进行对所load的对象进行初始化即:Hibernate. initialize(employeeSet) ,则肯定会报错。因为在为访问数据库之前load()方法懒加载返回的是一个对象的代理,获取它的

lanhaics的专栏 659

hibernate关联关系一对多

1. 什么是关联(association) 1.1 关联指的是类之间的引用关系。如果类A与类B关联,那么被引用的类B将被定义为类A的属性 首先建2个实体类 Order.java package com.jt3.entity; import java.util.ArrayList; import java.util.List; public class Order...

weixin_30502157的博客 76

Hibernate懒加载深入分析

Hibernate懒加载深入分析 懒加载可以提高性能吗?不可以简单的说"能",因为Hibernate的关系映射拖累了SQL的性能,所以想出懒加载来弥补.只是弥补而以,不会超越.所以大家不要想着使用了懒加载总体性能就提高了,其实总体性能不下降就万幸了. 懒加载为Hibernate中比较常用的特性之一,下面我们详细来了解下懒加载的原理和注意事项 Loa...

u012339998的专栏 105

(10) Hibernate懒加载详解

懒加载为hibernate中比较常用的特性之一,下面我们详细来了解下懒加载的原理和注意事项 Load()方法的懒加载原理 在Hibernate中,查询方法有两个,分别是get()和load(),这两种方法的不同就是load()拥有懒加载的特性。Load()方法就是在查询某一条数据的时候并不会直接将这条数据以指定对象的形式来返回,而是在你真正需要使用该对象里面的一些属性的时候才会去数据库

jianfpeng241241的专栏 372

Java进阶学习第二十天(Hibernate框架:集合映射、关联映射、对象的状态、一级缓存、懒加载、一对一映射、组件映射、继承映射)

一、集合映射 需求: 用户网上购物填写地址(一对多) 1、javabean设计 public class User { private int userId; private String userName; // 一个用户,对应的多个地址 private Set&amp;amp;amp;lt;String&amp;amp;amp;gt; address; private List&amp;amp;amp;lt;String&amp;am

_Gerald的博客 419
上一篇: 5位数字黑洞C源码
下一篇: 20111123这一年就这样了
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值