引言
凡是有相同点的知识,都要拿出来对比一下,对比着学习,收获多多哦~~~~
Session的load和get方法都可以跟团聚指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。但是还是有区别的。
get()方法
当调用session.get()时,首先在session缓存中查找,然后在二级缓存中查找,如果有就返回数据,没有的话直接查询数据库,数据库中如果没有就返回null,不会报错。
Load()方法
1)lazy=true
当调用session.load()时,首先在session缓存中查找,然后在二级缓存中查找,如果查到对象,返回的是一个代理对象,如果后面没有使用查询结果,就不会像数据库发起查询。只有使用查询结果才会真正的向数据库发出查询,我们称之为懒加载(lazy)。XXX.hbm.xml文件中默认配置lazy=”true”。如果没有查到数据会抛出ObjectNotFoundException异常。
2)lazy=false
若配置文件中lazy=”false”,那load()方法的查询顺序和get()方法一样,但是当没有查到数据的时候还是会发出ObjectNotFoundException异常。
Demo
1)get
User user =(User)session.get(User.class, 1);
立即去执行数据库查询。
当没有查到数据的时候,返回null
2)load
//不会发出sql
User user =(User)session.load(User.class, 1);
不会立即执行数据库查询
//不会发出sql
System.out.println("user.id="+user.getId());
因为执行过load方法之后会在hibernate的一级缓存里放一个map对象,该map对象的key就是userId的值,所以当执行getId()时,就会去一级缓存里拿map的key值,而不去执行数据库查询,所以不报错,不执行数据库操作。
//会发出sql
System.out.println("user.name="+ user.getName());
缓存中没有,执行了数据库操作。
当没有查到数据的时候,返回ObjectNotFoundException异常。
总结
get()不支持懒加载,load支持懒加载!