Hibernate中get方法和load方法的區別

來源:互聯網
上載者:User

標籤:out   with   span   code   記錄   對象   語句   返回結果   消極式載入   

1.從返回結果上對比:

load方式檢索不到的話會拋出org.hibernate.ObjectNotFoundException異常;

get方法檢索不到的話會返回null;

2.從檢索執行機制上對比:

load方法的執行則比較複雜首先尋找session的persistent Context(一級緩衝)中是否有緩衝,如果有則直接返回,如果沒有則去尋找二級緩衝,如果有則返回,如果沒有則判斷是否是lazy,若不是lazy,直接存取資料庫檢索,查到記錄返回(並且同時在二級緩衝中存放查到的資料方便下次使用,若再下次使用時在二級快取命中,就是查到資料,則有可能將資料放到

一級緩衝中。),查不到拋出異常。 若是lazy,則返回代理對象,而不到資料庫中尋找,除非使用此對象時,才到資料庫中尋找。

get方法先到一級緩衝,然後二級,最後db尋找。

 

Get載入(資料庫中存在檢索的資料)
public void testLoadNotNull() {          Session session= HibernateUtils.getSession();                  // 資料庫中存在id為2的資料          User user = (User)session.load(User.class, 2);            System.out.println(user);          System.out.println(user.getId() + "---->>" +          user.getName());          HibernateUtils.closeSession();      }

      因為Hibernate規定get方法不能使用消極式載入,當執行到User user = (User)session.get(User.class, 2);這條語句時,get方法首先會查詢session緩衝,沒有的話就查詢二級緩衝,最後會查詢資料庫,因此在執行該語句的時候,會先發出sql語句進行查詢。而且,執行get方法的時候,get方法每次都會從資料庫直接查詢。

Get載入(資料庫中不存在檢索的資料)
/**  * 查詢資料庫中不存在的資料  */  public void testGetWithNull() {           Session session  = HibernateUtils.getSession();         User user = (User)session.get(User.class, 0);        System.out.println(user);          HibernateUtils.closeSession();     }

 同上,在執行到User user = (User)session.get(User.class, 0);這條語句時,get方法每次都是直接查詢資料庫,在執行該語句時,Hibernate會發出sql語句,到資料庫進行查詢資料,由於id為0的資料不存在,get方法查詢不到資料時,會返回null。

 

Load載入(資料庫中存在檢索的資料)
/**  * 資料庫中存在查詢的資料  */  public void testLoadNotNull() {            Session session = HibernateUtils.getSession();         User user = (User)session.load(User.class, 2);</span>                 System.out.println(user);                 user.getName());                 HibernateUtils.closeSession(session);      }  }
  Hibernate中,load方法是支援懶載入的,在執行到User user = (User)session.load(User.class, 2);這條語句時,load方法首先會尋找session的persistent Context中是否存在緩衝,如果存在則直接返回;如果沒有緩衝,則load方法會判斷是否是lazy載入,如果不是lazy方式,則直接存取資料庫,查詢Id為2的資料,由於資料庫中存在Id為2的資料,因此get方法會返回實體物件。 在這個例子中,load方法採用的是lazy方式,因此在執行load方法時,Hibernate不會發出sql語句,因為此時Hibernate建立了代理對象,但並沒有訪問代理對象的屬性。當執行System.out.println(user);時,Hibernate才會初次發出sql語句, Load載入(資料庫中不存在檢索的資料)
/**  * 資料庫中不存在查詢的資料  */  public void testLoadWithNull() {          Session session = HibernateUtils.getSession();         User user = (User)session.load(User.class, 0);        System.out.println(user);          user.getName());          HibernateUtils.closeSession(session);      }

 

    在執行到load方法時,load方法會首先查詢session中是否存在緩衝,如果存在則直接返回,如果不存在則會判斷是否為lazy,這裡設定的是lazy方式,因此load方法會認為資料庫     中存在資料,直接建立代理對象,把代理對象返回給user。    而執行到System.out.println(user);時,Hibernate會發出sql語句,訪問資料庫查詢Id為0的資料,由於資料庫中不存在Id為0的資料,因此load方法會返回org.hibernate.ObjectNotFoundException,直接拋出異常。 總之對於get和load的根本區別,一句話,hibernate對於load方法認為該資料在資料庫中一定存在,可以放心的使用代理來消極式載入,如果在使用過程中發現了問題,只能拋異常;而對於get方法,hibernate一定要擷取到真實的資料,否則返回null。

Hibernate中get方法和load方法的區別

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.