问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Hibernate中get方法和load方法的区别

发布网友 发布时间:2022-04-13 21:20

我来回答

2个回答

懂视网 时间:2022-04-14 01:42

对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库

1. 对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null。这个相对比较简单,也没有太大的争议。主要要说明的一点就是在这个版本中get方法也会查找二级缓存!

2. load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论:

(1)若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个ObjectNotFoundException。

(2)若为false,就跟get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。

这里get和load有两个重要区别:

如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
load方法可返回没有加载实体数据的代理类实例,而get方法永远返回有实体数据的对象。(对于load和get方法返回类型:好多书中都说:“get方法永远只返回实体类”,实际上并不正确,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。)

linux

热心网友 时间:2022-04-13 22:50

hibernate中get方法和load方法的根本区别
如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据
库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该
记录,那没办法,只能抛异常ObjectNotFoundException,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据
时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下
session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延
迟加载。
对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。

虽然好多书中都这么说:“get()永远只返回实体类”,但实际上这是不正确的,get方法如果在session缓存中找到了该id对应的对象,如果刚好该
对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有
加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。

前面已经讲了,get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。

总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,就抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...先讲女主的灵魂飘荡了一段时间,然后重生,请问是那本? 拯救者散热器怎么开 电脑如何一键还原系统电脑一键还原怎么操作 神舟笔记本电脑怎么重新设置神舟战神bios恢复出厂设置 神舟电脑恢复出厂设置神舟战神怎么恢复原厂系统 水泥楼梯如何铺木楼梯 家里面楼梯是水泥的不想铺地毯或者地砖还能铺什么 楼梯的水泥台阶上可以铺地板革吗 手机腾讯会议共享屏幕播放视频没声 腾讯会议共享屏幕没声音怎么办 请将你找到的某品牌微信公众号矩阵截图发到讨论区。(分析一下是什么矩阵,按照? 一个认证的企业微信公众号和多个未认证的个人公众能建立微信矩阵吗? 阜阳市区现在经常见到穿着UU跑腿衣服的配送小哥,有谁知道他们都有什么服务吗? 在安徽阜阳做uu跑腿一个月了,遇到不少奇葩事 阜阳uu跑腿有几个站点 阜阳UU跑腿服务怎么样? 阜阳UU跑腿怎么样?送东西多久到? 刚买的固态硬盘怎么安装的 在hibernate中,get方法与load方法的区别有哪些 荣事达洗衣机电机和电容一般都多少钱? 金羚洗衣机启动电容多少钱一个? 海信全自动洗衣机的电容器多少价位 淘宝上一千多的笔记本电脑可以买吗?用来办公查资料看电影可以吧? 我在市面上看到有一千多块钱的笔记本电脑,不知道这些电脑质量可靠吗? 网上一千多的笔记本电脑怎么样? 一千多可以买笔记本电脑吗? 一千多的电脑能办公吗? 沂水太平洋人寿保险公司制度 急!太平洋人寿保险 太平洋人寿保险 化妆课程起什么名字可以吸引学生 西安老年大学开设的化妆课吸引了许多人报名,你认为老了还有必要打扮吗? 应届硕士研究生 事业单位 不满一年 已解除劳动合同 转正定级 干部身份怎么转正 西安一学校开设弹珠课引热议,高校的特色课你知道有哪些吗? 一万澳元:一万澳元等于多少英镑 为了女生节,我们学院举办了一个讲化妆和穿衣打扮的讲座,求主持词应该怎么写? 一万澳元o 北京化妆学校排名前十的都有哪些学校? 运城哪里可以学化妆 嘉兴化妆学校哪里好? 紧身牛仔裤虽美,不能贪穿 没插sim卡可以唤醒Siri吗 屁股上肉很多,具体的减肥方法。 OA上找不到支出报销单模板怎么添加 费用报销单,如材料款,工程款,运输费,办工用品,生活用品,工具款,伙食费,加油费,出差住宿费,等, 臀部大怎么减肥我的臀部有点太大了怎么能减下去呢*肉太多了怎么减肥呢有什么方法呢大家帮我推荐一下? 屁股很大,很多肉,怎么减? 大腿屁股上的肉都很松,怎么减 hibernate中get和load,find的区别