熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Hibernate/JPA成功使用的十點心得

2013-11-23 20:18:55  來源: Java開源技術 

  大約一年以前我為了學習一些Hibernate專業知識因此我參加了一個Hibernate項目從那時起我一直在使用Hibernate框架下的JPA(Java持久API)實現使用的思想仍就是一樣的那個項目使用了一個數據庫這個數據庫規模有些大略顯落後並且還被許多的應用程序共用為了盡快加入到項目中我開始學習一些Hibernate知識從書本上的例子開始學習感覺很簡單學起來也很快但是發現從零開始開發一個項目並且控制它又是另外一回事了試著在一個大型復雜被許多應用程序共用的數據庫上使用Hibernate就又完全不同了弄清楚了我可能遭遇到的技術難點我開始想別的招了要盡快從另外的方向開始克服困難

  在最終的學習和實踐中我發現我還是學到了許多重要的東西雖然我們的項目還沒有完全做完但是我認為我們目前已經非常漂亮的應用了Hibernate/JPA的一些思想現在我需要重新思考反省我所學到的東西如下便是我學到的一些心得

  )和數據庫管理員成為朋友

  目前存在一個趨勢就是一些Java開發者忽視數據庫管理員的重要性這便犯了一個很大的錯誤對於要取得任何的ORM(對象關系映射)技術的成功和數據庫管理員保持一個良好的工作關系是至關重要的有如下兩個原因

  單獨數據庫管理員雖然不能使Hibernate項目成功但是他們通常可以讓這些項目失敗

  數據庫管理員對數據庫本身具有很好的洞察力很好的職業習慣告訴你一些易犯的錯誤和操作建議我能記起這樣的很多例子一個數據庫管理員的建議節約了我們很多的時間和提供給我們一個很好的解決方案

  在大多數情況下擁有好的數據庫管理員並且和他們保持良好的關系對你ORM(對象關系映射)工作至關重要

  )從一開始使用(最好強制使用)好的命名標准

  我們知道對命名標准的討論將會有爭議的但是我們必須明確一件事情我們的命名要讓我們的數據模型有意義這能讓開發者使用起來簡單以免他們迷惑所以如何命名實體和屬性是非常重要的我有我喜歡命名標准並且認為他們是最好的但是在這裡我不想把他們強加於你們最重要的是你自己做出決定使用什麼樣的命名標准並且讓所有人使用它實際上不僅僅命名標准需要統一其它的也需要(如布爾型用Y/N 或者 /表示)

  )不要試著映射所有的屬性

  我們總是設法使用工具如Dali來映射所有的東西然後形成一張表格(一些表格有上百列 !)這最終會很麻煩為什麼?因為我們使用的是共用的先前的數據庫有許多的字段是我們並不關心和從來不使用的映射它們只會導致性能問題和造成混亂

  )讓數據庫做自己擅長的工作

  我們想有一個好的清晰的數據模型因此我們不惜任何代價寫一些額外的查詢語句來獲取對象相關數據要麼使用存儲過程要麼使用函數這是做法是錯誤的數據庫優勢在於存儲而不是保持Hibernate創建或讀寫的數據舉個例子我們有一個對象與之相關聯的有一個狀態這個狀態在整個應用程序中都要用到因此它毫無疑問是要執行的但是我們不想每次都要單獨的寫一個查詢語句這個問題在於這個狀態是從一些統計計算中派生出來的並且這些統計計算需要用到一對多的關系每次從加載的對象中讀取數據的代價是非常高的後來跟我們其中的一位數據庫管理員交流了一下發現一個我們可以使用的sql函數能夠很快的獲得該狀態我們使用@Formula來映射成一個狀態屬性就能得到我們所需要的所有東西這仍就是域模型的一部分但是執行起來非常好有時像這樣的一個折衷的辦法能夠起到很大的效果

  )分解數據庫

  在一開始我就想在Hibernate中模型化整個數據庫結果發現這是不切實際的原因如下a)這是一項巨大的工程並且要花費幾周的時間而用戶根本看不到你做了什麼實際的工作

  b)我不可能在第一次就把它弄好後繼的開發者無論如何都會修改它們的

  現在有一個趨勢就是希望在開始之前將所有的事情都進行映射但是當時你開始這麼做後你不需在這上面花很多的時間我後來發現一個好的辦法就是將數據庫分解工作的時候一塊一塊的進行發現這很有幫助

  )密切注意觸發器

  密切注意數據庫觸發器有如下兩個原因

  a)在後台觸發器很隱蔽的執行了一些功能讓你很是疑惑不知道發生了什麼

  b)當你在Hibernate端需要復制一些東西的時候觸發器會做一些手腳之前我們好幾次沒有認識到這個教訓導致我們丟失了很多數據這些都是由觸發器引起的這幾乎讓我們很是郁悶

  )避免使用工具來自動生成你的模型

  沒錯這些工具的使用可以節約時間(雖然我們發現了Dali有一個很嚴重的bug但是我們還是使用它)但是最後你不得不重新做很多的事情其實手動也花費不了你很多的時間當你親自做的時候這可以讓你有機會熟悉那些數據

  ) 盡量多的使用命名查詢語句(NamedQueries)

  雖然很容易寫查詢語句但是在許多的情況下使用NamedQueries會更好這會有助於你完成兩件事情

  a)它能更加重用因為被命名的查詢語句通常在代碼的重要地方

  b)你的查詢語句在開始的時候就是正確的那麼在查詢語句中的錯誤更加容易發現

  要習慣這樣做需要花一些時間但是這麼做是值得的

  )預期管理

  對於任何一種框架技術甚至觀念來說這是非常重要的要銘記在心由於某些原因人們傾向於專注某一個特征這些特征實際上或許不存在或許被誇大有時它很小很容易理解(舉個例子理解一些實際的工作需要在Hibernate中映射)有時我也不知道他們是如何管理實現一些概念(如Hibernate是如何管理計劃修正的)無論如何找到預期目標是什麼然後管理它們是非常重要的如果你的團隊認為Hibernate會使得數據庫管理員沒有用處把他們解雇那麼你將會有一個潛在的問題存在

  )使用富域模型(rich domain modeling)

  我所遇到的一件很悲哀的事情就是在域對象僅僅是一個簡單的數據容器的時候我要使用Hibernate而像Hibernate這樣的工具讓我們以面向對象的方式來使用數據簡單的映射數據只是讓我們停留在中途當我本能的想到使用富域模型(rich domain modeling)的時候我發現我們可以重用很多的代碼我們的其它層變得不那麼混亂了並且我們的代碼更加容易測試


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28274.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.