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

在Spring中使用JDO

2013-11-23 20:10:46  來源: Java開源技術 

  前言

  在此前的Spring A Developers Notebook摘錄中作者Bruce Tate和Justin Gehtland討論了在Spring中使用iBATIS OR持久化框架的內容出於其他的原因此選擇要求深入SQL底層在這篇第五章的摘錄中他們轉向那些更加徹底地把SQL從你的Spring應用中獨立的持久化框架

  JDO是基於接口標准的持久化或如Tate 和Gehtland所言在Java應用中非EJB標准的持久化一經提及JDO他們不是卷入那場眾說紛纭的辯論之中而是著眼於如何把一頂級的實現Kodo引入到你的Spring應用中接著轉去討論最流行的且可能是與Spring集成最好的OR框架Hibernate正如他們所指出的盡管是非標准的但你可以說在EJB之後Hibernate是世界上最流行的持久化框架了本章中作者們不僅為你演示設置每個框架的具體細節而且還清晰地表明了各種框架的使用方法之差異

  就象Developers Notebook 系列中所有的書一樣你將由直接的且實用的方式獲得信息這些信息包含了完成你工作所需的細節換言之一切來自實戰沒有講義

  在Spring中使用JDO

  JDO是Java 應用中非EJB標准的一種持久化方式在這部分中我們將使用我們喜歡的JDO實現Kodo來實現我們應用中的透明持久化雖然我們不會試著教給你JDO的知識但會說明怎樣使用JDO來為我們的應用提供持久化的功能

  無論你從事JDO多長時間可能都會使你想起眾說紛纭的辯論直到最近大多數人都避免使用JDO隨著JDO 版本和許多可靠的商業化及開源的JDO實現的暫停發布這個持久化標准看起來就象是一個強壯的運動員在ORM舞台上蓄勢待發(譯注在翻譯本文時獲悉JDO已投票通過)實際上我所鐘愛的ORM是Solar Metric的Kodo 它或許稱得上JDO實現中的矯矯者了當Kodo達到商業化實現時它看起來比其它可供選擇的實現更加強壯且已獲得更靈活的映射支持更易於管理來自持久化企業核心越來越豐富的支持考慮以下這些優勢?        若你正尋找某些免費的或能對源代碼更好地控制的JDO實現你可在眾多的開源的JDO實現中選擇?        你可選擇一價格合理的商業化產品而且能得到支持和維護?        若選擇了那些一流的商業化廠商從較佳管理到靈活映射你都可能得到難以置信的功能和性能?        在獲得所有的這些優勢的同時你還能獲得開源標准提供的保護和安全

  我該怎麼辦?

  你將使用JDO來創建一個持久化模型隨後在fa?ade層中使用那個模型盡管應用程序中已創建了業務域模型但仍未被持久化你業已獲得fa?ade層的接口那麼只需完成下述的操作步驟便可在你的應用中使用JDO了通過字節碼增強器(byte code enhancer)讓域模型持久化

  簡單修改Spring的配置文件你就可在你的應用中使用Kodo 通過JDO模板建構使用持久化模型的fa?ade

  就這些了Spring會管理由PersistenceManagerFactory和PersistenceManager組成的JDO之核心資源把這些特殊的選項當作是JDO的數據源與連接你還可以讓Spring來管理事務上述三個步驟就是你所要完成的工作

  首先你需要下載和安裝Kodo從試用的版本開始你可在這裡找到本書中使用版本再次提醒你得把/kodojdo/lib中的包放入我們的/lib目錄下

  為持久化模型你得修改Ant任務以添加JDO字節碼增強的步驟象示例所示的那樣添加Ant任務來完成這一動作

  示例

  你也需要在Ant 建構文件中給kodojdojar jdojar and Jakartacommonslangjar增加路徑元素

  下一步建構持久化映射最簡便的辦法就是通過Kodo向導運行Workbench(在你所安裝的Kodo的\bin目錄下)並從菜單中選擇MetaDataàCreate MetaDate反之你可使用/kodojdo/bin目錄下的metadatatool 和mappingtool兩個腳本它們分別被taMappingTool和taJDOMetaDataTool的運行文件所使用

  為了與其它JDO版本保持一致因此你打算用XML從頭建構映射文件用類的元數據和mapping 文件生成jdo文件此兩文件都在/war/WEBINF/classes/com/springbook目錄下

  示例聲明元數據文件

  示例  packagejdo

  示例描述了映射文件

  示例 packagemapping

  幾乎太容易了模型本身沒有被持久化那就是我們使用OR技術的原因盡管你仍需在你的應用程序中有一層代碼也就是我們所說的fa?ade層來調用那個持久化模型因此你將看到一系列的模板調用查詢器(finder)聲明了JDO查詢語句及持久化刪除更新新增的對象你已經有了一個接口但還需要實現fa?ade(如示例

  示例 KodoRentABikejava

  這不是完全的JDO查詢語言的查詢它只不過是個過濾器而已JDO 將會增加一個便利的查詢字符串因而你可以以單一的字符串來添加完全的JDO查詢而毋須建構完全的查詢

  public class KodoRentABike extends JdoDaoSupport implements RentABike {private String storeNamepublic List getBikes( ) {return (List)getJdoTemplate( )find(Bikeclass)}public Bike getBike(String serialNo) {Collection c = getJdoTemplate( )find(Bikeclass serialNo == + serialNo + Bike b = nullif(csize( ) > ) {b = (Bike)erator()next( )}return b}public Bike getBike(int bikeId) {return (Bike)getJdoTemplate( )getObjectById(Bikeclass new Long(bikeId))}public void saveBike(Bike bike) {getJdoTemplate( )makePersistent(bike)}public void deleteBike(Bike bike) {getJdoTemplate( )deletePersistent(bike)}//etc

  最後你需要設定一些配置來把這些都組裝在一起示例先說明了JDO的配置

  示例 packageproperties

  # To evaluate or purchase a license key visit YOUR_LICENSE_KEY_HEREjavaxjdoPersistenceManagerFactoryClass kodojdbcruntimeJDBCPersistenceManagerFactoryjavaxjdooptionConnectionDriverName commysqljdbcDriverjavaxjdooptionConnectionUserName bikestorejavaxjdooptionConnectionPasswordjavaxjdooptionConnectionURL jdbcmysql://localhost/bikestorejavaxjdooptionOptimistic truejavaxjdooptionRetainValues truejavaxjdooptionNontransactionalRead truejavaxjdooptionRestoreValues truekodoLog DefaultLevel=WARN Runtime=INFO Tool=INFOkodoPersistenceManagerImpl DetachOnClose=true注意DetachOnClose 選項它確保了JDO在關閉連接時的延遲加載因而你應用程序的其它部分 象視圖(view)只能訪問已加載的BeanSpring上下文需把JDO持久化管理器持久化管理工廠fa?ade以及任何在fa?ade上的服務組合在一起這些都在context中完成(示例Example RentABikeAppservletxml E\RentABikeApp\war\WEBINF\kodopropertiesBruces Bikes

  記得你已經有了一個使用fa?ade的測試用例因此你可以建構並讓它運行起來

  發生了什麼事?

  這是個展示Spring功能的非常好的例子盡管你已從根本上顛覆了持久化層的實現但這並沒有影響到應用程序的其它部分以下就是它怎樣工作的說明

  Spring首先使用依賴注入來解決所有的依賴加載的上下文配置了含有你所提供數據源的JDO隨之在fa?ade的JDO實現中設定持久化管理器工廠接著當你在fa?ade上調用方法時Spring給了你持久化管理器並使用它來處理你所提供的查詢你可以這樣來看Spring提供一普通的(generic)JDO fa?ade方法稱之為模板你插入(plug in)細節並把控制權交給Spring

  當你在騎自行車或編寫代碼時一個最重要的衡量標准是效率每當腳踏板轉一圈或每寫一行代碼你可完成多少的工作?想想JDO版本的應用程序Spring編程模型最迫切的事是效率為了看明白我說的意思想一下你沒見到的?        沒有異常管理而?        往往就是這些異常管理混亂了你應用程序的較底層利用Spring未捕捉異常(Unchecked Exception)的機制?        你可以在得到異常的地方適當地做些事情?        沒有資源管理只要有JDBC連接的地方?        就有JDO持久化的管理器Spring配置了持久化管理器工廠?        並且在模板內為你管理持久化管理器?        你沒有被強制管理事務及facade的安全Spring讓你很容易地來配置這些東西?        因此你可以從你的fa?ade層中將丑陋的細節束之高閣?        讓它專注於使用持久化模型

  在Spring的模板中這些都為你完成了這些模板放在與Spring框架一起的代碼中這些讓你讀起來更加容易理解或在必要時debug之簡而言之你可以在每一行的代碼中得到平衡更象你在高速地踏自行車那就是所有最成功的框架和程序設計語言的底線

  在Spring中使用Hibernate

  Spring開發人員選擇Hibernate作為持久化框架已經有很長的一段時間了盡管Spring團隊在持續致力於改善與其它持久化框架的集成但在所有與Spring集成的持久化框架中 Hibermate保持了最為廣泛使用的地位確切地說這兩個輕量級的解決方案在相互促進中獲得成功他們一起茁壯成長在這此例中我們將表明如何將Spring與Hibernate集成起來一同工作

  Hibernate是個優秀的持久化框架她深受歡迎運行速度相當快並且是免費的除此之外它還擁有豐富的映射支持且是一個便利的使用模型使得它在全球的開發者中流行起來Hibernate已經在小型和中型的項目中經受住了非常好的考驗實際上盡管它還未被確認為標准但可以說在EJB之後Hibernate是世界上最流行的持久化框架

  我該怎麼辦?

  既然你已用持久化域模型和fa?ade 的ORM配置了Spring你就了解了基本的流程由於Spring 被設計成與Hibernate 獨立你只需從Spring的/dist 目錄中復制hibernatejar aopalliancejar cgligfulljar domjjar ehcachejar 及admgjar到你項目的/lib目錄下

  由於Hibernate使用了反射機制 因此就沒有字節加強步驟所有你已嘗試過讓模型持久化的做法就是來創建映射並且在上下文中引用他們示例表明了創建映射的過程

  Example Bikehbmxml

  unsavedvalue=>

  Hibernate版的這個映射較之JDO版的相應代碼更為雅致它有著更加豐富的識別碼(Identification)生成庫

  Example Customerhbmxml

  unsavedvalue=> Example Reservationhbmxml unsavedvalue=>cascade=none/>cascade=none/>

  在上下文中你需要配置Hibernate屬性配置session factory 並把session factory插入到fa?ade中使用JDO 上下文iBATIS上下文及Hibernate上下文的事務策略都是一樣的就想他們本該那樣似的那就是依賴注入正為你所做的一部分示例表明了對上下文的變動

  Example RentABikeAppservletxml

  Bruces Bikesclass=orgspringframeworkormhibernateLocalSessionFactoryBean>
com/springbook/Bikehbmxmlcom/springbook/Customerhbmxmlcom/
springbook/ReservationhbmxmlnetsfhibernatedialectMySQLDialecttrue

  不象JDO那樣Hibernate用戶經常把所有的映射類放入獨立定的多個文件中這不是必需的僅是Hibernate用戶特別喜歡管理事前的一種方式而已

  既然已有了一個fa?ade接口你只需一個Hibernate實現即可你可以使用模板就象JDO那樣至於查詢器(Finder)你所要做的就是指定一個Hibernate 查詢語言(HQL)語句至於更新(update)部分你所要做的就是指明將被存儲的新對象示例就是個非常薄的fa?ade的例子

  Example HibRentABikejava

  package comspringbookimport orgspringframeworkormhibernatesupportHibernateDaoSupportimport javautilListimport javautilDateimport javautilSetimport netsfhibernateQuerypublic class HibRentABike extends HibernateDaoSupport implements RentABike {private String namepublic List getBikes( ) {return getHibernateTemplate( )find(from Bike}public Bike getBike(String serialNo) {Bike b = nullList bikes = getHibernateTemplate( )find(from Bike where serialNo = ? serialNo)if(bikessize( ) > ) {b = (Bike)bikesget(}return b}public Bike getBike(int bikeId) {return (Bike)getHibernateTemplate( )load(Bikeclass new Integer(bikeId))}public void saveBike(Bike bike) {getHibernateTemplate( )saveOrUpdate(bike)}public void deleteBike(Bike bike) {getHibernateTemplate( )delete(bike)}public void setStoreName(String name) {thisname = name}public String getStoreName( ) {return thisname}public List getCustomers( ) {return getHibernateTemplate( )find(from Customer}public Customer getCustomer(int custId) {return (Customer)getHibernateTemplate( )load(Customerclass new Integer(custId))}public List getReservations( ) {return getHibernateTemplate( )find(from Reservation}public List getReservations(Customer customer) {return getHibernateTemplate( )find(from Reservation where custId = ? customergetCustId( ))}public List getReservations(Bike bike) {return getHibernateTemplate( )find(from Reservation where bikeId = ? bikegetBikeId( ))}public List getReservations(Date date) {return getHibernateTemplate( )find(from Reservation where resdate = ? date)}public Reservation getReservation(int resId) {return (Reservation)getHibernateTemplate( )load(Reservationclass new Integer(resId))}}發生了什麼事?Hiberante的做法與JDO極其相似Spring的JDO模板代表著一套默認的DAO方法你所要做的就是來定制他們通常是HQL查詢語句及任何HQL參數化查詢中參數的可能取值接著Spring拿到控制權獲得session發動查詢並且處理任何的異常再次重申你看到獨特的平衡示例給了在不使用Spring時你不得不編寫的典型的Hibernate之方法Example HibRentABikejava public List getBikesOldWay( ) throws Exception {// Relies on other static code for configuration// and generation of SessionFactory Might look like:// Configuration config = new Configuration( )// configaddClass(Bikeclass)addClass(Customerclass)// addClass(Reservationclass)// SessionFactory mySessionFactory = Configuration// buildSessionFactory( )List bikes = nullSession s = nulltry {s = mySessionFactoryopenSession( )bikes = sfind(from Bike}catch (Exception ex) {//handle exception gracefully}finally {sclose( )}return bikes}示例再次表明了在Spring中實現查找的相應代碼Example HibRentABikejava public List getBikes( ) {return getHibernateTemplate( )find(from Bike}

  新手需要特別注意本文代碼中的黑體字部分應用程序的每一代碼塊必須盡力完成好一個功能且只能一個

  關於…

  …Hibernate的替代品?Hibernate確實是免費的運行速度快的有效且是流行的它已經受住了考驗且有著極其優秀的性能和靈活性大部分的工具中有著很好的Hibernate支持並且Hibernate支持所有相關的數據庫但我仍只推薦在小型和大型的應用中使用Hibernate

  到目前為止H作為一開源框架持久化社區不能過多地贊揚Hibernate或聲討其替代者如此盲目的擁趸導致了禮教崇拜式的決策Hibernate的競爭者們在某些方面比她做得更好若你的應用程序有以下的特征不妨試一試其他的解決方案

  標准JDO和JDBC解決方案已然成為標准盡管Hibernate是開源的但她還未被確認為標准在過去的十年中你得信賴JBoss 組織和基金會的動機來做正確的事情且對任何的框架而言至今已證明那是不可靠的地位

  管理其他的解決方案易於管理如Kodo JDO和Top Link就有管理面板用他們很容易地來監控緩存狀態及主動(eager)加載或延遲加載的狀態

  映射其他的框架有著功能更強大的和更加靈活的映射支持若你不想對你的數據庫schema進行控制你最好選用其他的解決方案你可能也喜歡用GUI工具來映射你的schema 那麼象JDO Genie 或Cayenne可能就最適合你的應用

  總而言之使用主流的框架或許最終可能是正確的選擇但通常情況下只要稍微深入的探究你就可以找到更加合適的解決方案Hibernate確實值得考慮但別忘了還有其他好的選擇

  運行一個測試用例

  運行測試用例是很容易的事你已經學會了它就是你在fa?ade 上運行的那個測試用例

  我該怎麼辦?

  由於測試用例已存在因此你可以運行現有的fa?ade測試你僅要確保正確設置測試數據即可且你可以使用未被變更過的應用上下文那就是Spring的強大之處可測試性

  發生了什麼事?

  你使用過已存在的測試用例這很好因為你只需要管理數據庫增長的細節在下章中你將開始深入學習可在Spring AOP的應用程序中添加的服務的相關知識

  作者czyczy(作者的blog


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