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