一、get不支持lazy,load支持lazy。
二、采用get加載數(shù)據(jù),如果沒有匹配的數(shù)據(jù),返回null,而load則拋出異常。
get的例子:
1
public void testGetMethod() {
2
Session session = null;
3
try {
4
session = HibernateUtils.getSession();
5
session.beginTransaction();
6
7
//馬上發(fā)出查詢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:在執(zhí)行第8行語句的時候,如果數(shù)據(jù)庫有相關(guān)的記錄,則立刻發(fā)出sql語句,即使是沒有第9行中user.getName()方法調(diào)用,如果沒有匹配的記錄則返回來一個null。
load方法例子:
1
public void testLoadMethod() {
2
Session session = null;
3
try {
4
session = HibernateUtils.getSession();
5
session.beginTransaction();
6
7
//不會發(fā)出查詢sql,因為load方法實現(xiàn)了lazy(懶加載或延遲加載)
8
//延遲加載:只有真正使用這個對象的時候,才加載(發(fā)出sql語句)
9
//hibernate延遲加載實現(xiàn)原理是代理方式
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:在執(zhí)行到10句代碼的時候并沒有立刻發(fā)出sql語句,由于load實現(xiàn)了lazy延遲加載,延遲加載只有真正使用該對象的時候才進(jìn)行加載,發(fā)出sql語句,關(guān)鍵是11句代碼。如果load方法里面的id在數(shù)據(jù)庫表里面沒有相關(guān)的,則會發(fā)出ObjectNotFoundException異常。
PSPS:可以通過設(shè)置斷點,用debug來跟蹤相關(guān)變量跟對象的改變,這樣就可以很清晰理解load和get這兩個方法。
-------------------------------------------------------------------------------------------------
PS:本博客文章,如果沒有注明是有“轉(zhuǎn)”字樣,屬于本人原創(chuàng)。如果需要轉(zhuǎn)載,務(wù)必注明作者和文章的詳細(xì)出處地址,否則不允許轉(zhuǎn)載,多謝合作!