【hibernate】session中的load和get对比

引言

        凡是有相同点的知识,都要拿出来对比一下,对比着学习,收获多多哦~~~~

        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支持懒加载!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章