鄭啟龍
(渤海大學(xué)教育與體育學(xué)院,遼寧錦州121013)
基于Hlbernate運(yùn)動(dòng)員血液生物學(xué)指標(biāo)監(jiān)控持久化設(shè)計(jì)
鄭啟龍
(渤海大學(xué)教育與體育學(xué)院,遼寧錦州121013)
針對(duì)運(yùn)動(dòng)員血液生物學(xué)指標(biāo)監(jiān)控系統(tǒng)開(kāi)發(fā)過(guò)程中數(shù)據(jù)存取的難點(diǎn)問(wèn)題,采用Hibernate進(jìn)行數(shù)據(jù)持久化設(shè)計(jì),通過(guò)Hibernate體系結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)、Hibernate配置文件、持久化類設(shè)計(jì)、映射文件設(shè)計(jì)等方面研究,得到了進(jìn)行數(shù)據(jù)持久化操作的類文件和映射文件。開(kāi)發(fā)人員直接操作這兩類文件就可完成數(shù)據(jù)存取的全部工作,簡(jiǎn)化了軟件開(kāi)發(fā)過(guò)程,提高了軟件的開(kāi)發(fā)效率和可維護(hù)性。
運(yùn)動(dòng)員;血液生物學(xué)指標(biāo);監(jiān)控系統(tǒng);Hibernate;持久化
血液是人體生命的源泉,使體內(nèi)細(xì)胞不斷更新,各組織、器官的功能得以維持,讓人充滿活力。人體的生理變化和病理變化往往引起血液成分的改變,所以血液成分檢測(cè)有著重要的臨床意義[1]。在運(yùn)動(dòng)訓(xùn)練方面,應(yīng)用血液生物學(xué)指標(biāo)對(duì)運(yùn)動(dòng)員身體機(jī)能評(píng)定和訓(xùn)練負(fù)荷監(jiān)控越來(lái)越受到重視,但目前運(yùn)用生物學(xué)指標(biāo)對(duì)運(yùn)動(dòng)員機(jī)能狀態(tài)綜合監(jiān)控的研究較少[2]。血液生物學(xué)指標(biāo)監(jiān)控系統(tǒng)通過(guò)監(jiān)測(cè)運(yùn)動(dòng)員相關(guān)指標(biāo)來(lái)掌握運(yùn)動(dòng)訓(xùn)練情況和身體機(jī)能狀態(tài),為提高運(yùn)動(dòng)訓(xùn)練效果和運(yùn)動(dòng)成績(jī)提供客觀依據(jù)。數(shù)據(jù)持久化是系統(tǒng)開(kāi)發(fā)的重要工作,Hibernate是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系型數(shù)據(jù)持久化框架,通過(guò)對(duì)JDBC的輕量級(jí)對(duì)象封裝,向程序員屏蔽了底層的數(shù)據(jù)庫(kù)操作,使Java程序員可以隨心所欲地使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù),提高了軟件的開(kāi)發(fā)效率和可維護(hù)性。本文基于Hibernate展開(kāi)研究,為系統(tǒng)開(kāi)發(fā)提供支持。
持久化(Persistence)是把數(shù)據(jù)保存到可永久保存的存儲(chǔ)設(shè)備中,持久化最常用的方法是對(duì)象關(guān)系映射。對(duì)象關(guān)系映射(ORM,Object Re1ationa1 Mapping)用于實(shí)現(xiàn)程序?qū)ο蟮疥P(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)的映射[3]。ORM廣義上是對(duì)象模型和關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)結(jié)構(gòu)之間的相互轉(zhuǎn)換;狹義上是基于關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)存儲(chǔ),實(shí)現(xiàn)虛擬面向?qū)ο蟮臄?shù)據(jù)訪問(wèn)接口。Hibernate 對(duì)JDBC(Java Data Base Connectivity)進(jìn)行了輕量級(jí)對(duì)象封裝,是目前Java領(lǐng)域應(yīng)用最廣泛、最靈活的持久化關(guān)系映射框架[4]。Hibernate體系結(jié)構(gòu)如圖1所示。
圖1 Hibernate體系結(jié)構(gòu)
在圖1所示的四層體系結(jié)構(gòu)中,最頂層是應(yīng)用程序的臨時(shí)對(duì)象,最底層是數(shù)據(jù)庫(kù),即通過(guò)中間層把臨時(shí)對(duì)象保存到數(shù)據(jù)庫(kù)中。第二層是核心部分,由5個(gè)組件構(gòu)成,通過(guò)持久化對(duì)象與頂層相連,Session Factory為事務(wù)之間可以重用數(shù)據(jù)提供可選的二級(jí)緩存,Session表示應(yīng)用程序與持久存儲(chǔ)層之間交互操作的一個(gè)單線程對(duì)象,Transaction通過(guò)抽象將應(yīng)用從底層具體的JDBC、JTA以及CORBA事務(wù)隔離開(kāi),Transaction Factory生成Transaction對(duì)象實(shí)例的工廠,供擴(kuò)展和實(shí)現(xiàn)時(shí)使用;Connection Provider起到連接池的作用,生成JDBC連接工廠,通過(guò)抽象將應(yīng)用從底層的Datasource或DriverManager隔離開(kāi)[5_6]。第三層是事務(wù)訪問(wèn)接口,包括3種方式,JNDI(Java名稱和目錄接口)用于管理對(duì)象;JDBC(Java的數(shù)據(jù)庫(kù)連接)用于本地事物操作;JTA(Java事務(wù)API)用于操作跨數(shù)據(jù)庫(kù)資源操作。
運(yùn)動(dòng)員血液生物學(xué)指標(biāo)監(jiān)控系統(tǒng)用于監(jiān)控運(yùn)動(dòng)員的血液生物學(xué)指標(biāo),因此,包括運(yùn)動(dòng)員和指標(biāo)兩個(gè)實(shí)體。運(yùn)動(dòng)員實(shí)體用于存儲(chǔ)運(yùn)動(dòng)員信息,一個(gè)運(yùn)動(dòng)員保存為一條記錄,“運(yùn)動(dòng)員編號(hào)”為主關(guān)鍵字;指標(biāo)實(shí)體用于存儲(chǔ)采樣以及化驗(yàn)指標(biāo)值,一個(gè)運(yùn)動(dòng)員的一次采樣保存為一條記錄,“運(yùn)動(dòng)員編號(hào)和采樣編號(hào)”構(gòu)成聯(lián)合主關(guān)鍵字。因此,運(yùn)動(dòng)員實(shí)體和指標(biāo)實(shí)體之間是一對(duì)多的聯(lián)系,運(yùn)動(dòng)員實(shí)體的一條記錄對(duì)應(yīng)指標(biāo)實(shí)體的多條記錄,“運(yùn)動(dòng)員編號(hào)”為指標(biāo)實(shí)體的外關(guān)鍵字。兩個(gè)實(shí)體間的一對(duì)多聯(lián)系通過(guò)“運(yùn)動(dòng)員編號(hào)”屬性建立名稱為“FK_Ath1etes_Indicators”的外鍵約束實(shí)現(xiàn)。系統(tǒng)基于Sq1Server數(shù)據(jù)庫(kù)管理系統(tǒng)開(kāi)發(fā),為了簡(jiǎn)化系統(tǒng)開(kāi)發(fā),只選用Varchar、Char、Datetime和Decima1等4種數(shù)據(jù)類型實(shí)現(xiàn)變長(zhǎng)字符串、定長(zhǎng)字符串、日期時(shí)間型和精確數(shù)據(jù)值的存儲(chǔ)。系統(tǒng)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)結(jié)果如圖2所示。
圖2 系統(tǒng)數(shù)據(jù)結(jié)構(gòu)
配置文件定義了數(shù)據(jù)庫(kù)的連接信息和全局配置信息。使用配置文件具有功能強(qiáng)大、操作方便、良好的格式檢查機(jī)制、文件自動(dòng)加載等優(yōu)點(diǎn)。Hibernate的核心配置文件是Hibernate.cfg.xm1,放置在c1asspath文件夾下,系統(tǒng)啟動(dòng)時(shí)能默認(rèn)地加載。也可以使用Properties文件進(jìn)行配置,但Hibernate提供XML文件,不僅提供了更易讀的結(jié)構(gòu)和更強(qiáng)的配置能力,還可以直接對(duì)映射文件加以配置。本系統(tǒng)的Hibernate.cfg.xm1文件基本配置信息如下:
基本配置是系統(tǒng)運(yùn)行需要的常規(guī)信息。除此之外,為了軟件開(kāi)發(fā)和維護(hù)的方便性,還附加一些配置信息,包括是否輸出SQL語(yǔ)句到控制臺(tái)、Hibernate每次從數(shù)據(jù)庫(kù)取出并放到JDBC的Statement中的記錄條數(shù)、數(shù)據(jù)庫(kù)方言、Hibernate每次批量操作的記錄數(shù)、是否允許Hibernate用JDBC的可滾動(dòng)結(jié)果集、連接數(shù)據(jù)庫(kù)時(shí)是否使用Unicode編碼等、指定映射文件等。
持久化是將程序數(shù)據(jù)在持久狀態(tài)和臨時(shí)狀態(tài)間轉(zhuǎn)換的機(jī)制。持久化類(Persistent C1ass)用于完成對(duì)數(shù)據(jù)庫(kù)的存取操作,即將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中或從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)。一個(gè)持久化類的實(shí)例處于臨時(shí)狀態(tài)(Transient)、持久化狀態(tài)(Persistent)和脫管狀態(tài)(Detached)3種狀態(tài)之一,這與持久化上下文(Persistent Context)有關(guān)。臨時(shí)狀態(tài)是實(shí)例從未與任何上下文關(guān)聯(lián)過(guò);持久化狀態(tài)是實(shí)例正在與某個(gè)上下文關(guān)系;脫管狀態(tài)是實(shí)例曾經(jīng)與某個(gè)上下文關(guān)系過(guò),但那個(gè)上下文被關(guān)閉了。save()方法把臨時(shí)對(duì)象轉(zhuǎn)變?yōu)槌志没瘜?duì)象;update()方法把脫管對(duì)象轉(zhuǎn)換為持久化對(duì)象;c1ose()方法將持久化對(duì)象轉(zhuǎn)變?yōu)槊摴軐?duì)象;de1ete()方法將脫管對(duì)象轉(zhuǎn)變?yōu)榕R時(shí)對(duì)象或?qū)⒊志没瘜?duì)象轉(zhuǎn)化為臨時(shí)對(duì)象;1oad()方法將臨時(shí)對(duì)象轉(zhuǎn)變?yōu)槊摴軐?duì)象。持久化類一般稱為PO(Persistent Object),JavaBean的一種用來(lái)裝載數(shù)據(jù)的簡(jiǎn)單對(duì)象,將功能、處理、值、數(shù)據(jù)庫(kù)訪問(wèn)和其他任何可以用Java代碼創(chuàng)造的對(duì)象進(jìn)行打包,編程時(shí)直接使用JavaBean而不用擔(dān)心變化。PO由實(shí)體屬性定義、關(guān)聯(lián)實(shí)體定義和getter/setter方法構(gòu)成。以一對(duì)多關(guān)系為例,“一”端增加Set屬性,使用集合屬性來(lái)訪問(wèn)關(guān)聯(lián)的持久類,“多”端直接訪問(wèn)被關(guān)聯(lián)實(shí)體。getter和setter是JAVABean提供的取值和賦值的方法[7_8]。
圖2中存在Sq1Server數(shù)據(jù)庫(kù)管理系統(tǒng)的4種類型,與Hibernate之間的數(shù)據(jù)類型對(duì)應(yīng)關(guān)系如下:Varchar對(duì)應(yīng)String、Char對(duì)應(yīng)Character、Datetime根據(jù)表示的值不同映射為Date/Time/Timestamp之一、Decima1映射為Big_Decima1。以指標(biāo)(indexInformation)實(shí)體為例來(lái)說(shuō)明持久化類實(shí)現(xiàn)方法。對(duì)于簡(jiǎn)單的JavaBean,除了setter/getter方法外不包含其他邏輯。在PO中通常要實(shí)現(xiàn)Seria1izab1e接口。主要用來(lái)完成以下兩項(xiàng)工作:一是保存javaBean設(shè)計(jì)時(shí)的配置信息供程序啟動(dòng)時(shí)使用;二是用于遠(yuǎn)程方法調(diào)用(RMI,Remote Method Invocation),當(dāng)向遠(yuǎn)程對(duì)象傳遞消息時(shí)用來(lái)傳遞參數(shù)的返回值。指標(biāo)(indicators)實(shí)體包含了imp1ements Seria1izab1e的PO實(shí)現(xiàn)代碼如下:
Hibernate的持久化類和關(guān)系數(shù)據(jù)庫(kù)表之間的映射用一個(gè)XML文檔實(shí)現(xiàn)。通過(guò)一系列XML元素的配置,把持久化類映射到數(shù)據(jù)庫(kù)表,并把持久化類的屬性映射數(shù)據(jù)列。映射文件通常包括四類元素,<hibernate_mapping>是映射文件的根元素,包含若干可選屬性;<c1ass>定義一個(gè)持久化類與數(shù)據(jù)表的映射關(guān)系;<id>映射屬性到數(shù)據(jù)庫(kù)表主鍵的字段對(duì)應(yīng)關(guān)系;<property>映射持久化類的屬性與數(shù)據(jù)庫(kù)表字段之間的對(duì)應(yīng)關(guān)系;<composite_id>映射多個(gè)屬性構(gòu)成的聯(lián)合主鍵;<generator>定義內(nèi)置生成器,包括increment自增方式生成主鍵、包含IP地址和JVM啟動(dòng)時(shí)間的UUID、由底層數(shù)據(jù)庫(kù)生成的Identity自增主鍵、底層數(shù)據(jù)庫(kù)提供的Sequence序列標(biāo)識(shí)符、按照high/1ow算法生成的Hi1o標(biāo)識(shí)符、跨數(shù)據(jù)庫(kù)時(shí)由底層方言產(chǎn)生的native標(biāo)識(shí)符等。除了映射持久化類與數(shù)庫(kù)表之間的對(duì)應(yīng)關(guān)系外,還要進(jìn)行關(guān)聯(lián)關(guān)系映射,包括一對(duì)一關(guān)聯(lián)、一對(duì)多關(guān)聯(lián)和多對(duì)多關(guān)聯(lián),每個(gè)關(guān)聯(lián)又可分為單向和雙向兩種[9]。與上面PO實(shí)現(xiàn)相對(duì)應(yīng)的指標(biāo)(indicators)實(shí)體的映射文件代碼如下:
<many_to_one co1umn=″ath1etesNo″c1ass=″th1etes″name=″ath1etesNo″not_nu11=″true″cascade=″none″/>
對(duì)運(yùn)動(dòng)員訓(xùn)練情況和身體機(jī)能狀態(tài)監(jiān)控的方法很多,血液生物學(xué)指標(biāo)是比較理想的方法,具有較強(qiáng)的科學(xué)性[10]。本文基于Hibernate研究運(yùn)動(dòng)員血液生物學(xué)指標(biāo)監(jiān)控系統(tǒng)持久化方法,開(kāi)發(fā)人員以此成果為依據(jù)可以直接編程實(shí)現(xiàn),提高了軟件開(kāi)發(fā)效率。本文研究成果具有以下優(yōu)點(diǎn):對(duì)象/關(guān)系數(shù)據(jù)庫(kù)映射,使用時(shí)只需要操縱對(duì)象,拋棄了數(shù)據(jù)庫(kù)中心的思想;透明持久化,對(duì)象生存期很短僅與Session相關(guān)聯(lián),一旦Session被關(guān)閉,對(duì)象就會(huì)脫離持久化狀態(tài)被應(yīng)用程序的任何層自由使用;緩存機(jī)制,提供一級(jí)緩存和二級(jí)緩存,簡(jiǎn)潔了HQL編程。
[1]百度百科.血液[EB/OL].(2015_06_30).http://baike.baidu.com/ view/18631.htm?fr=a1addin.
[2]盧明月,李之俊.血液生物學(xué)指標(biāo)在女壘運(yùn)動(dòng)員冬訓(xùn)期間機(jī)能狀態(tài)監(jiān)控中的應(yīng)用[J].長(zhǎng)春理工大學(xué)學(xué)報(bào):自然科學(xué)版,2009,32(3):424_426.
[3]郭朗.Hibernate框架ORM常見(jiàn)數(shù)據(jù)關(guān)聯(lián)分析[J].信息系統(tǒng)工程,2013,26(4):134.
[4]徐金虎,宋斌,丁銳.Spring MVC+Hibernate+jQeury模式開(kāi)發(fā)框架應(yīng)用研究[J].自動(dòng)化技術(shù)與應(yīng)用,2015,34(3):42_46.
[5]賴小平.基于SpringMVC+Hibernate的傻瓜進(jìn)銷(xiāo)存系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].福建電腦,2015,31(3):38_40.
[6]張國(guó)平,王文虎,馬麗.基于Struts和Hibernate的煤礦管理系統(tǒng)的設(shè)計(jì)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2014,24(4):243_245.
[7]蔡群英.基于Struts2+Hibernate+Spring的留言板的開(kāi)發(fā)[J].電腦知識(shí)與技術(shù),2014,10(24):5656_5658.
[8]張少應(yīng),程傳旭.基于Hibernate持久化層的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2014,24(12):101_104.
[9]葉廣仔,劉曉蔚.在線考試系統(tǒng)中Hibernate框架的應(yīng)用[J].電子設(shè)計(jì)工程,2013,21(7):1_4.
[10]談艷.運(yùn)動(dòng)員機(jī)能狀態(tài)監(jiān)控中血液生物學(xué)指標(biāo)的綜合運(yùn)用[J].遼寧體育科技,2011,33(3):55_58.
Perslstence deslgn on hemo-blologlcal lndlces monltorlng system of athletes based on Hlbernate
ZHENG Qi_1ong
(School of Education and Sports,Bohai University,Jinzhou 121013,China)
For the difficu1ties of data access in the deve1oping hemo_bio1ogica1 indices monitoring system of ath1etes,Hibernate is used to design data persistence,and c1ass fi1es and mapping fi1es that can operate data persistence is obtained by studying Hibernate architecture,data structure design,Hibernate configuration fi1es,persistent c1ass design,mapping fi1e design.Deve1-opers can manipu1ate these two types of fi1e direct1y to comp1ete a11 the work of data access,so the software deve1opment process wi11 be simp1ified and the deve1opment efficiency and maintainabi1ity of software wi11 be improved.
ath1etesj hemo_bio1ogica1 indicesj monitoring systemj Hibernatej persistence
TN919.5
A
1674_6236(2016)10_0174_03
2015_07_03稿件編號(hào):201507032
渤海大學(xué)博士啟動(dòng)基金(2015bs001)
鄭啟龍(1972—),男,山東膠南人,博士,講師。研究方向:體育教學(xué)與訓(xùn)練。