周末和 MIKE 吃飯的時候,他詢問,上次提說的問題,什么時候能寫出來。“對Session和Transaction的處理,最好單獨實現一個模板類來統一做”
溫故 居于常規的Hibernate的DAO代碼。例子做一個Create操作



2

3

4



5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23



24

25



26



27

28



29

30

31

32



33

34

35

36

37

這段代碼怎么樣? 假如這樣的代碼會出現在你的每一個DAO的每一個方法里面(除了SessionFactory建議寫成一個方法,因為你只需要一個實例)你能接受嗎?只說try catch 就夠你寫的。
如果代碼在每個地方都出現。那么我想就可以抽離出來。做成一個模板。具體該怎么做呢?今天我打算談三種比較成熟的做法。
① 采用Spring提供的模板功能
② 自己實現一個功能相當的模板
③ 其他可借鑒的實現
采用Spring提供的模板功能
看代碼:



2

3



4

5

6

7

8

9

10

比起上面的代碼,現在簡單多了吧?其實該做的事情都做了,只不過是被Spring封裝起來了。大致跟蹤一下Spring的SourceCode的實現。
1) 在抽象類HibernateDaoSupport中有一個方法getHibernateTemplate()。通過getHibernateTemplate()得到一個HibernateTemplate對象。
2) 在HibernateDaoSupport中有兩個方法。通過他們來的到這個 HibernateTemplate對象



2

3

4

5

6

7



8

9

10

11

12

3)



2



3

4



5

6

7

8

9

10

11

4)
核心的實現就在HibernateTemplate里面。篇幅原因,我就不Copy全部的代碼了



2

3

4

這里,幫你做了Session和Transaction的封裝。讓你可以免去煩瑣無謂的try catch finally 和相關操作。在Spring中基本上采用容器處理事務。這樣在事務的處理上也達到了統一性。
到這里,感覺還不錯吧? 要是你沒有打算使用Spring呢?這種優勢不就沒有了嗎?那到未必,既然都有得“抄襲”拉!就自己弄一個吧!
自己實現一個功能相當的模板
不容易描述清楚,就用簡單的代碼來說明吧。

2

3

4

5

6

7

8

9



10

11



12

13

14



15

16

17

18

19

20

21

22

23

24



25



26

27



28

29

30



31



32

33

34



35

36

37

38

39

40



41

42

43

44

45

46


2

3

4



5

6

7

8

9


2

3

4

5



6



7

8



9



10

11

12

13

14

15

16


2

3



4



5

6

7

8

9

10

11

12

13

上面的DAO實現還有代碼風格都不推薦大家學習。實現一個優秀的DAO框架沒這么簡單。這種做法我沒有在真實項目中檢驗過,不確定,會不會有其他問題。因為這里我只是為了簡單的表述HibernateTemplate思想的實現。只要理解了這種思想,相信你能寫出更好更完美的實現。如果有更好的主意或者建議請Email告訴我。
其他可借鑒的實現
《深入淺出Hibernate》采用hibernatesynchronizer生成基礎代碼的方式,架構自己的持久層。作者自己實現了一個相似功能的HibernateTemplate和HibernateCallback接口。有興趣的話可以去研究一下。
這種能直接生成基礎代碼的方式很不錯。比起Spring我還是覺得麻煩了很多。而且我也還沒時間去全面玩這個插件(據說,有提供一些成熟的模板方式生成,我只玩過默認的生成方式)。