博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate中get和load方法的区别
阅读量:7275 次
发布时间:2019-06-29

本文共 1210 字,大约阅读时间需要 4 分钟。

hot3.png

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

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

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

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

举例说明如下:

load加载方法:

    Users user = (Users)session.load(Users.class, userId);    

get加载方法:

    Users user = (Users)session.get(Users.class, userId);  两加载方法区别:

区别1:如果数据库中,没有userId的对象。如果通过get方法加载,则返回的是一个null;如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException;

区别2:load支持延迟加载,get不支持延迟加载。

也就是说:

Java代码 

  1. Users user = (Users)session.load(Users.class, userId);  

这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。

而:

Java代码 

  1. Users user = (Users)session.get(Users.class, userId);  

则立即去执行数据库查询。 

注意:

Java代码 

  1. Users user = (Users)session.load(Users.class, userId);  

  2. System.out.println(user.getId());  

上面这2句代码,不会去执行数据库操作。因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是userId的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。

转载于:https://my.oschina.net/u/1453975/blog/204381

你可能感兴趣的文章
IIS6.0搭建FTP服务器,以及建立多用户FTP
查看>>
SpringBoot 定时器详解
查看>>
js小知识
查看>>
转:Vim实战指南(三):高级技巧
查看>>
POJ 2251 Dungeon Master (非三维bfs)
查看>>
FileStream大文件复制
查看>>
[实战]MVC5+EF6+MySql企业网盘实战(11)——新建文件夹2
查看>>
60行JavaScript代码俄罗斯方块
查看>>
SQL-删除重复记录
查看>>
Numpy
查看>>
【matlab】合并两个cell
查看>>
查询引用 表,视图,的所有存储过程
查看>>
Spring MVC + Spriing + MyBatis整合,写给新人
查看>>
有限偏序集必有最大元
查看>>
我要学算法
查看>>
空间谱专题07:干涉仪仿真思路
查看>>
查询该表的所有字段名以及该字段的最大值最小值
查看>>
mysql 案例 ~ 主从复制延迟之并行复制
查看>>
模拟 POJ 2993 Emag eht htiw Em Pleh
查看>>
JMETER 使用JDBC查找数据作为参数
查看>>