一、get不支持lazy,load支持lazy。
二、采用get加載數據,如果沒有匹配的數據,返回null,而load則拋出異常。
get的例子:
1
public 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
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

PS:在執行第8行語句的時候,如果數據庫有相關的記錄,則立刻發出sql語句,即使是沒有第9行中user.getName()方法調用,如果沒有匹配的記錄則返回來一個null。
load方法例子:
1
public 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
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

PS:在執行到10句代碼的時候并沒有立刻發出sql語句,由于load實現了lazy延遲加載,延遲加載只有真正使用該對象的時候才進行加載,發出sql語句,關鍵是11句代碼。如果load方法里面的id在數據庫表里面沒有相關的,則會發出ObjectNotFoundException異常。
PSPS:可以通過設置斷點,用debug來跟蹤相關變量跟對象的改變,這樣就可以很清晰理解load和get這兩個方法。
-------------------------------------------------------------------------------------------------
PS:本博客文章,如果沒有注明是有“轉”字樣,屬于本人原創。如果需要轉載,務必注明作者和文章的詳細出處地址,否則不允許轉載,多謝合作!