一卡通系統(tǒng)中持久層的設計與實現(xiàn)
文章出處:http://www.sgrivertours.com 作者: 人氣: 發(fā)表時間:2011年09月12日
摘 要:主要論述運用基于O/R(Object/Relational對象/關系)映射技術的hibernate框架來設計一卡通系統(tǒng)中持久層,從持久層的設計到實現(xiàn)都做了具體的說明.先介紹一卡通系統(tǒng)持久層的整體架構,再從具體類之間的關系對持久層做了詳細的設計,最后通過一卡通持久層的實現(xiàn)來完成從理論到實踐、從設計到實際應用的過程.
計算機應用軟件發(fā)展到現(xiàn)在由單層體系結構發(fā)展為多層體系結構,而三層結構是目前典型的一種應用軟件結構.它包括表述層:提供與用戶的交互界面;業(yè)務邏輯層:實現(xiàn)多個業(yè)務邏輯;數(shù)據(jù)庫層:負責存放和管理應用的持久性業(yè)務數(shù)據(jù).而hibernate是連接java應用程序的關系數(shù)據(jù)庫的中間件 J,在分層軟件架構中它位于持久層,封裝了所有數(shù)據(jù)訪問細節(jié),使業(yè)務邏輯層可以專注于業(yè)務邏輯.
1 一卡通系統(tǒng)持久層的設計
一卡通系統(tǒng)是基于J2EE(Java 2 Enterprise E-dition建立在Java 2平臺上的企業(yè)級應用的解決方案)標準的分布式多層次的體系結構,后臺應用java語言開發(fā)服務器端應用程序,前臺采用Delphi 開發(fā)客戶端應用程序,應用具有海量存儲的大型Oracle數(shù)據(jù)庫,采用開源的Jboss應用服務器進行邏輯處理.它借助校園網(wǎng)絡傳輸數(shù)據(jù),進行科學合理建設,實現(xiàn)各校區(qū)、各類商務收費、各種身份識別的一卡通行.
1.1 持久層總體架構
圖1展示了一卡通系統(tǒng)數(shù)據(jù)庫持久層的總體設計架構.
圖1 一卡通系統(tǒng)數(shù)據(jù)庫持久層的總體設計架構
在圖1中,將應用層放在了持久層的上部,實際上在傳統(tǒng)的項目中,應用層充當著持久層的一個客戶端角色.持久層的接口大致可以分為以下幾種類型:
(1)一些被用戶的應用程序調用的,用來完成基本的創(chuàng)建、讀取、更新、刪除操作以及查詢操作的接口.這些接口是持久層實現(xiàn)用戶程序的商業(yè)邏輯的主要接口 ,包括Session、Transaction和Query.
(2)持久層用來讀取諸如映射表這類配置文件的接口,典型的有Configuration類.
1.2 持久層詳細設計
(1)對象持久化類:ClassPersister接口封裝了把一個對象實例持久化到數(shù)據(jù)庫中的所有邏輯.ClassPersister類非常簡單,它的三個屬性isProxy、isPersistent和timeStamp分別指示一個類對象是否是一個代理、是否是從持久機制獲取的以及由持久機制記錄的最后一次被應用程序訪問的時間.代理對象只包括系統(tǒng)和用戶標識一個對象所需的最少信息,因為它們比完整的對象小,所以可以減少網(wǎng)絡流量.當需要真正的對象的時候,發(fā)送給代理load消息,可以刷新對象的所有屬性.屬性isPersistent的重要性在于一個對象需要知道它已經(jīng)存在于持久機制中還是新創(chuàng)建的,這將決定在保存對象時生成insert還是update語句.timeStamp屬性被用于支持持久機制中的樂觀鎖.ClassPersister實現(xiàn)了多個方法:如load、delete等,它們是可以將對象持久化的.也
就是說,應用程序開發(fā)者不需要知道任何關于持久策略的知識就可以將對象持久化,只需要向對象發(fā)送這些消息,而對象自己完成其它的事情.
(2)持久化集合對象類:盡管Class Persister封裝了使單個對象持久化的行為,但是還不夠,因為常常需要操作多個持久對象.CollectionPersister類層次就支持這種操作,它支持一次保存、獲取、刪除多個對象.Collection Persister是一個抽象類,它捕獲子類的公共行為但是不會直接被實例化.這個類允許定義用以限定對象范圍的選擇條件.
(3)事務接口類:Transaction接口類的實例是通過Transaction-Factory的beginTransacti0n方法獲得.通過JDBC-Transaction類實現(xiàn)了transaction接口的各個方法.事務的典型生命周期 是:被創(chuàng)建,添加一系列操作任務,接受begin消息,然后或者提交事務、或者回滾事務、或者重試.只能在begin方法返回成功后,才能提交事務.否則要么回滾,要么當持久機制上的鎖已經(jīng)移除后,重試事務.提交和回滾事務的能力是非常重要的,因為事務是原子的,或者成功或者失敗,只能將所有任務完全回滾或者完成所有任務后完全提交.
(4)緩存機制:緩存可以使應用程序避免為相同的數(shù)據(jù)項進行多次數(shù)據(jù)庫讀操作.如果應用程序需要讀取一個持久化類的實例,但是并不打算修改它們,可以使用read—only緩存.這是最簡單,也是實用性最好的策略.應用程序需要更新數(shù)據(jù),可能read—write 緩存比較合適.Session緩存.不管何時當傳遞一個對象給save,update或者saveOrUpdate,或者使用load,find,iterate或者filter取得一個對象的時候,該對象被加入到Session的內部緩存中.當后繼的flush被調用時,對象的狀態(tài)會和數(shù)據(jù)庫進行同步.如果在處理大量對象并且需要有效的管理內存的時候,可能不希望發(fā)生這種同步,evict方法可以從緩存中去掉對象和它的集合.在SessionFactory中定義了一些方法來從緩存中清除一個實例、整個類、集合實例或者整個集合.
(5)持久管理器類:Session起著持久管理器的功能,它由Session—Facrory生成,在運行時刻Session維護到持久機制(關系數(shù)據(jù)庫)的連接并管理持久機制的交互.Session實際上是在Connection、Query、Criteria和Transaction之間扮演了一個協(xié)調者,因為它是這些類的實例提交自己并被處理的地方.Session借助SessionFactorylmplementor和Sessi0nImplement0r與SQL生成器類層次,映射類層次和持久化機制類層次進行交互.
啟動應用程序時,開始要做的事情之一就是讓Session將創(chuàng)建映射類(ClassMap,AttributeMap )實例所需要的信息從持久機制讀進來.Session會在內存中緩沖這些映射類,以便在映射對象到持久機制的時候使用它們.Session的save、delete和load方法,將調用ClassPersister的相應方法來實現(xiàn)對象的持久化管理.如果已知某個持久化實例的標識符,Session的load方法可取出它.一種形式使用一個類對象作為參數(shù),會把狀態(tài)裝載到另一個新創(chuàng)建的對象中去.另一種是給出一個實例,會在其中裝載狀態(tài).
1.3 持久層的應用實現(xiàn)
在一卡通系統(tǒng)中,所有的業(yè)務對象,如用戶對象、帳戶對象、報表對象、權限對象、角色對象、日志對象等,都由持久層持久化服務將其映射至數(shù)據(jù)庫中相關的表,這些對象之間的關系表,如一對一、一對多、多對多等也由持久層映射中的one to one、many to one、collection的many to many、one to many等元素映射在持久化對象中.
1.3.1 持久層配置:持久層的配置使用xml(eXtensible Markup Language擴展性標識語言)進行配置.配置文件命名為hibernate.cfg.xm1.我們主要配置數(shù)據(jù)庫連接的各種參數(shù)和根據(jù)項目的進展逐步添加涉及的映射文件,以供持久層管理事務、產(chǎn)生SQL和管理JDBC連接等.
1.3.2 數(shù)據(jù)表的設計:數(shù)據(jù)庫設計主要是對各個業(yè)務對象設計相應的表和它們之間的關系表,同一般的數(shù)據(jù)庫設計一樣.一卡通系統(tǒng)包括學?;拘畔⒈?、食堂營業(yè)部門表、帳戶表、卡表、卡類型表、消費數(shù)據(jù)表及操作日志表等等.多數(shù)表之問存在關系,如帳戶和卡之問存在一對多的關系、卡類型和卡之問存在一對多的關系等.
1.3.3 實體Bean(EntityBean)的編寫:將一卡通系統(tǒng)中所有需要持久化的類以標準JavaBean的形式編寫.對每一個屬性值都要有public的getXXX和setXXX,命名符合bean方法的命名規(guī)則.
1.3.4 映射(Mapping)文件的編寫:Mapping文件寫得正確與否關系著持久層的持久化服務能否正常運行;寫得是否合適對整個解決方案的性能也有很大的影響.在這里,需要注意的就是各種關系的映射.映射文件的放置位置要和配置文件hibernate.cfg.xml中指明的位置保持一致.
1.3.5 持久化對象操作:先用Configuration方法調用properties文件進行系統(tǒng)環(huán)境的初始化配置,并且利用addClass分別調用映射資源文件(object.xm1)和映射類文件(object.class).調用configuration.getproperties,檢查所使用的數(shù)據(jù)庫,檢查表的關聯(lián)性,一對多等關 系的設置,檢查外鍵約束性等.使用數(shù)據(jù)庫的JDBC的驅動連接數(shù)據(jù)庫,查看所用數(shù)據(jù)庫連接池,同時檢驗JNDI等的配置情況.
2 程序的執(zhí)行
顯示結果,啟動應用服務器jboss進行系統(tǒng)的初始化,實現(xiàn)持久層與Oracle數(shù)據(jù)庫的連接.如圖2在eclipse(java開發(fā)環(huán)境)的控制臺中的運行結果.
圖2 eclipse IDE下程序的jboss啟動服務的初始化運行結果
3 結束語
利用持久層的對象持久化服務 ,可以有效地進行數(shù)據(jù)庫數(shù)據(jù)到業(yè)務對象的O/R映射,簡化了客戶端對數(shù)據(jù)庫的操作過程.并且在項目后期維護、程序修改以及更換數(shù)據(jù)庫方面提供了便利;有利于節(jié)約開發(fā)成本和時間,提高業(yè)務應用性能,使其具有更靈活的業(yè)務邏輯.
參考文獻:
[1]孫衛(wèi)琴.精通Hibernate:java對象持久化技術詳解[M].電子工業(yè)出版社,2005
[2]劉洋.精通Hibomate[M].北京:電子工業(yè)出版社,2004.
[3]夏聽,曹曉鋼,唐勇.深入淺出Hibomate[M].北京:電子工業(yè)出版社,2005.
[4]湯娜,葉小平.數(shù)據(jù)庫理論及應用基礎[M].北京:清華大學出版社,2004.
[5]宋漢增,沈林.利用Hibernate對象持久化服務簡化Java數(shù)據(jù)庫訪問[J].計算機應用,2003,23(12):l_3.
作者簡介:周化峰(1979-),男,遼寧丹東人,沈陽理工大學信息科學與工程學院 碩士研究生
【稿件聲明】:如需轉載,必須注明來源和作者,保留文中圖片和內容的完整性,違者將依法追究。