程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 系統學習hibernate之二 Session中load和get

系統學習hibernate之二 Session中load和get

編輯:關於JAVA

用hibernate的ORM框架有一段時間了,現在來回顧一下Seesion中的load和get。

一、get不支持lazy,load支持lazy。

二、采用get加載數據,如果沒有匹配的數據,返回null,而load則拋出異常。

get的例子:

1public void testGetMethod() {
2    Session session = null;
3    try {
4      session = HibernateUtils.getSession();
5      session.beginTransaction();
6
7      //馬上發出查詢sql,加載User對象
8      User user = (User)session.get(User.class, "402880d01b9bf210011b9bf2c2ff0002");
9      System.out.println("user.name=" + user.getName());
10
11      user.setName("張三");
12      session.getTransaction().commit();
13    }catch(Exception e) {
14      e.printStackTrace();
15      session.getTransaction().rollback();
16    }finally {
17      HibernateUtils.closeSession(session);
18    }
19  }

PS:在執行第8行語句的時候,如果數據庫有相關的記錄,則立刻發出sql語句,即使是沒有第9行中user.getName()方法調用,如果沒有匹配的記錄則返回來一個null。

load方法例子:

1public void testLoadMethod() {
2    Session session = null;
3    try {
4      session = HibernateUtils.getSession();
5      session.beginTransaction();
6
7      //不會發出查詢sql,因為load方法實現了lazy(懶加載或延遲加載)
8      //延遲加載:只有真正使用這個對象的時候,才加載(發出sql語句)
9      //hibernate延遲加載實現原理是代理方式
10      User user = (User)session.load(User.class, "402880d01b9bf210011b9bf2b2ff0002");
11      System.out.println("user.name=" + user.getName());
12      user.setName("李四");
13      session.getTransaction().commit();
14    }catch(Exception e) {
15      e.printStackTrace();
16      session.getTransaction().rollback();
17    }finally {
18      HibernateUtils.closeSession(session);
19    }
20  }

PS:在執行到10句代碼的時候並沒有立刻發出sql語句,由於load實現了lazy延遲加載,延遲加載只有真正使用該對象的時候才進行加載,發出sql語句,關鍵是11句代碼。如果load方法裡面的id在數據庫表裡面沒有相關的,則會發出ObjectNotFoundException異常。

PSPS:可以通過設置斷點,用debug來跟蹤相關變量跟對象的改變,這樣就可以很清晰理解load和get這兩個方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved