写点什么

Hibernate 的 get 和 load 区别学习笔记

用户头像
风翱
关注
发布于: 2021 年 05 月 19 日

Hibernate 中 get 和 load 有什么不同之处? 


1.get 是立即加载,不支持延迟加载;load 是延迟加载。

2.get 会先查一级缓存,未找到的情况再找二级缓存,再找不到就直接查询数据库;load 先查一级缓存,如果没有找到,就创建代理对象,等需要的时候再查二级缓存和数据库。

3.get 没有找到会返回 null,load 没有找到会抛出异常。

4.当我们使用 session.load()方法来加载一个对象时,此时并不会发出 sql 语句,当前得到的是一个代理对象,这个代理对象只保存了实体对象的 id 值,只有当我们要使用这个对象,得到其他属性时,才会真正发出 sql 语句,从数据库查找我们的对象;相对于 load 延迟加载的方式,get 会直接得多,当我们用 session.get()方法来得到一个对象时,不管我们使不使用这个对象,此时都会发出 sql 语句去数据库中查询。


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

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

2)若为 false,就跟 Hibernate 的 get 方法查找顺序一样,只是最终若没发现符合条件的记录则会抛出一个 ObjectNotFoundException,所说的 load 方法抛异常是指在使用该对象的数据时数据库中不存在该数据时抛异常,而不是在创建这个对象时。

发布于: 2021 年 05 月 19 日阅读数: 9
用户头像

风翱

关注

还未添加个人签名 2017.11.24 加入

勇于尝试,持续成长

评论

发布
暂无评论
Hibernate的get和load区别学习笔记