用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這兩個方法。