引言
凡是有相同點的知識,都要拿出來對比一下,對比着學習,收穫多多哦~~~~
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支持懶加載!