【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支持懶加載!

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