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