Hibernate的load()和get()區別

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

一.得到實體對象的不一樣數據庫

  // 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以外的值會報錯.session

1.能夠得到id性能

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

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

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

因此兩者比較:session.load():①性能好不會發出SQL語句,可是若是查id以外的值會報錯.②報錯可控 不會出現NULL對象

                      session.get():①無論你用不用這個對象都會發出SQL語句,因此性能差,可是能夠查對象的全部值.  ②報錯不可控  查不到對象的話 會報NULL.blog

最後建議:使用createSQLQuery接口,通常的業務邏輯均可以知足. 完美!接口

相關文章
相關標籤/搜索