1. 程式人生 > >Hibernate的load()和get()區別

Hibernate的load()和get()區別

其他 其它 分享 sta log exce 沒有 pre alt

最近在用Hibernate的時候發現一個問題:比如我們從數據庫獲得一個對象時,使用session.get()方法還是session.load()? 兩種方法在獲得一個實體對象時是有區別的,在查詢性能上兩者是不同的。

一.獲得實體對象的不同

  // load方法
public student GetStudentBystudo(String studo){ student stu = null; Session session = getSession(); if(session != null){ try{ // get如果沒有查詢到數據,則返回null
// stu = (Student) session.get(Student.class, stuNo); stu = (student) session.load(student.class, studo);// load如果沒有查詢到數據,則拋出異常 }catch(HibernateException e){ e.printStackTrace(); }finally{ session.close(); } }

load方法是懶加載,,即:當我們使用session.load()方法來加載一個對象時,此時並不會發出sql語句,當前得到的這個對象其實是一個代理對象,這個代理對象只保存了實體對象的id值,只有當我們要使用這個對象,得到其它屬性時,這個時候才會發出sql語句,從數據庫中去查詢我們的對象。


這就造成在實際的運行中,如果想要獲得id之外的值會報錯.

1.可以獲得id

技術分享圖片技術分享圖片

2.獲取這個對象的其他值會報錯

技術分享圖片技術分享圖片

這裏的原因在上面已經說了,session.load()不會發出SQL語句,且只會得到對象的一個id值.

相比之下session.get()方法就比較直接,當我們使用session.get()方法來得到一個對象時,不管我們使不使用這個對象,此時都會發出sql語句去從數據庫中查詢出來.

所以二者比較:session.load():①性能好不會發出SQL語句,但是如果查id之外的值會報錯.②報錯可控 不會出現NULL

session.get():①不管你用不用這個對象都會發出SQL語句,所以性能差,但是可以查對象的所有值. ②報錯不可控 查不到對象的話 會報NULL.

最後建議:使用createSQLQuery接口,一般的業務邏輯都可以滿足. 完美!

Hibernate的load()和get()區別