本發(fā)明涉及電力系統(tǒng)數(shù)據(jù)庫(kù)領(lǐng)域,具體為一種通用的元數(shù)據(jù)/關(guān)系映射框架。
背景技術(shù):
自律分散的即插即用數(shù)據(jù)平臺(tái)采用以三層HashMap形式表示的元數(shù)據(jù)作為統(tǒng)一結(jié)構(gòu)來(lái)存儲(chǔ)各種格式的電力數(shù)據(jù)。元數(shù)據(jù)雖解決了異構(gòu)數(shù)據(jù)歸一化的問(wèn)題,但數(shù)據(jù)平臺(tái)中下層模塊的開(kāi)發(fā)者只能通過(guò)調(diào)用HashMap所支持的get/put方法并指定Tag/Key名作為參數(shù)對(duì)元數(shù)據(jù)進(jìn)行增、刪、改、查等操作,這不僅使模塊代碼違背了面向?qū)ο笤O(shè)計(jì)的原則,而且降低了開(kāi)發(fā)者對(duì)數(shù)據(jù)涉及具體業(yè)務(wù)的關(guān)注度。
技術(shù)實(shí)現(xiàn)要素:
為了克服上述現(xiàn)有技術(shù)的不足,本發(fā)明的目的在于提供一種通用的元數(shù)據(jù)/關(guān)系映射框架。為了達(dá)到上述目的,本發(fā)明所采用的技術(shù)方案為:一種通用的元數(shù)據(jù)/關(guān)系映射框架,其特征在于:邏輯結(jié)構(gòu)如下:映射配置的定義,編輯元數(shù)據(jù)/關(guān)系映射所必要的配置信息,配置信息保存在配置文件中;實(shí)體代理類(lèi)的生成,根據(jù)映射配置信息,生成與元數(shù)據(jù)中Tag對(duì)應(yīng)的實(shí)體代理類(lèi)的字節(jié)碼;DAO類(lèi)及其CRUD方法的生成,根據(jù)映射配置信息,為元數(shù)據(jù)各Tag生成對(duì)應(yīng)DAO類(lèi)的CRUD方法的字節(jié)碼,用于以面向?qū)ο蠛蜆I(yè)務(wù)相關(guān)的方式對(duì)元數(shù)據(jù)進(jìn)行增、刪、改、查操作;MQL語(yǔ)法分析,對(duì)用戶(hù)提交的類(lèi)SQL的MQL語(yǔ)句進(jìn)行語(yǔ)法分析,并提示語(yǔ)法錯(cuò)誤信息;結(jié)果集封裝與迭代,執(zhí)行用戶(hù)提交的MQL語(yǔ)句,并將返回結(jié)果集封裝為實(shí)體代理類(lèi)對(duì)象組成的列表以方便后續(xù)的迭代操作;事務(wù)管理,對(duì)元數(shù)據(jù)進(jìn)行更改的過(guò)程中,若發(fā)生任何錯(cuò)誤則自動(dòng)回滾數(shù)據(jù),以保證元數(shù)據(jù)的數(shù)據(jù)完整性。所述的一種通用的元數(shù)據(jù)/關(guān)系映射框架,其特征在于:所述映射配置的定義過(guò)程如下:步驟1:?jiǎn)?dòng)映射配置定義模塊,選擇要操作的元數(shù)據(jù)格式;步驟2:定義元數(shù)據(jù)中的每個(gè)Tag對(duì)應(yīng)的實(shí)體類(lèi)名稱(chēng);步驟3:定義Tag下的每個(gè)Key對(duì)應(yīng)的字段名稱(chēng)和類(lèi)型;步驟4:根據(jù)元數(shù)據(jù)采用的三層HashMap的中層Map,定義其Key值對(duì)應(yīng)的組成字段,以作為后述實(shí)體類(lèi)的主鍵字段;步驟5:分析并校驗(yàn)以上映射配置是否合法。所述的一種通用的元數(shù)據(jù)/關(guān)系映射框架,其特征在于:所述實(shí)體代理類(lèi)的生成過(guò)程如下:步驟1:讀取映射配置文件,獲取實(shí)體類(lèi)及其字段的信息;步驟2:根據(jù)映射配置信息,利用虛擬機(jī)字節(jié)碼生成工具,生成實(shí)體類(lèi)的字節(jié)碼,包括字段、主鍵字段、各字段的setter/getter方法;步驟3:結(jié)合動(dòng)態(tài)代理模式,為實(shí)體類(lèi)生成代理接口;步驟4:利用虛擬機(jī)字節(jié)碼生成工具,生成代理接口的實(shí)現(xiàn)類(lèi)。所述的一種通用的元數(shù)據(jù)/關(guān)系映射框架,其特征在于:所述DAO類(lèi)及其CRUD方法的生成過(guò)程如下:步驟1:根據(jù)映射配置信息,利用虛擬機(jī)字節(jié)碼生成工具,為元數(shù)據(jù)各Tag生成對(duì)應(yīng)DAO類(lèi)的字節(jié)碼;步驟2:為實(shí)體類(lèi)各字段生成對(duì)應(yīng)的findBy方法,其以某個(gè)字段的值為查找條件,返回對(duì)應(yīng)Tag下相匹配的記錄行構(gòu)成的實(shí)體對(duì)象列表;步驟3:生成findByPK方法,其以主鍵字段的值為查找條件,返回對(duì)應(yīng)Tag下具有相同中層Key值的唯一記錄行對(duì)應(yīng)的實(shí)體對(duì)象;步驟4:生成findAll方法,其返回對(duì)應(yīng)Tag下所有記錄行構(gòu)成的實(shí)體對(duì)象列表;步驟5:生成findByConditions方法,其分別以指定的多個(gè)字段值和字段名作為組合查詢(xún)條件和排序依據(jù),返回對(duì)應(yīng)Tag下相匹配的記錄行經(jīng)過(guò)排序后構(gòu)成的實(shí)體對(duì)象列表;步驟6:生成update方法,其根據(jù)指定的實(shí)體對(duì)象的主鍵字段找到對(duì)應(yīng)Tag下具有相同中層Key值的唯一記錄行,并使用實(shí)體對(duì)象的各字段值更新該記錄行下的對(duì)應(yīng)Key值;步驟7:生成delete方法,其根據(jù)指定的實(shí)體對(duì)象的主鍵字段找到對(duì)應(yīng)Tag下具有相同中層Key值的唯一記錄行,并刪除該記錄行;步驟8:生成insert方法,其根據(jù)指定實(shí)體對(duì)象所屬的實(shí)體類(lèi)找到對(duì)應(yīng)的Tag,并在該Tag下新增一條記錄行,該記錄行的中層Key值為指定實(shí)體對(duì)象的主鍵字段值。所述的一種通用的元數(shù)據(jù)/關(guān)系映射框架,其特征在于:通過(guò)框架提供的MQL語(yǔ)法分析、MQL語(yǔ)句執(zhí)行以及結(jié)果集封裝邏輯,數(shù)據(jù)管理平臺(tái)中下層模塊的開(kāi)發(fā)者可編寫(xiě)類(lèi)SQL語(yǔ)法的MQL語(yǔ)句以直接對(duì)元數(shù)據(jù)進(jìn)行CRUD操作。所述的一種通用的元數(shù)據(jù)/關(guān)系映射框架,其特征在于:在對(duì)元數(shù)據(jù)進(jìn)行增、刪、改等寫(xiě)操作時(shí),元數(shù)據(jù)/關(guān)系映射框架通過(guò)AOP技術(shù)自動(dòng)維護(hù)事務(wù)的開(kāi)啟和提交,并在發(fā)生任何異常時(shí)自動(dòng)回滾之前已執(zhí)行的寫(xiě)操作,保證了元數(shù)據(jù)的完整性和一致性,及降低了事務(wù)控制等非功能性代碼對(duì)業(yè)務(wù)代碼的侵入性,從而有效提升數(shù)據(jù)管理平臺(tái)中各下層模塊代碼的可理解性與可維護(hù)性。本發(fā)明可無(wú)縫適配到電力數(shù)據(jù)管理平臺(tái)中現(xiàn)有的元數(shù)據(jù)模塊之上??蚣芙柚鷦?dòng)態(tài)代理和AOP等手段,對(duì)最原始的元數(shù)據(jù)增、刪、改、查等操作進(jìn)行透明封裝,為以三層HashMap結(jié)構(gòu)存儲(chǔ)的元數(shù)據(jù)增添了關(guān)系模型所具備的能力和特征,具體包括:元數(shù)據(jù)查詢(xún)語(yǔ)言MQL(MetadataQueryLanguage)、Tag與實(shí)體對(duì)象映射配置、元數(shù)據(jù)CRUD操作的面向?qū)ο蠓庋b、結(jié)果集封裝與迭代API、事務(wù)控制等。本發(fā)明與現(xiàn)有的技術(shù)相比,具有如下優(yōu)點(diǎn):(1),框架采用動(dòng)態(tài)代理、字節(jié)碼生成和AOP等非侵入機(jī)制實(shí)現(xiàn),不需要修改現(xiàn)有以HashMap為存儲(chǔ)結(jié)構(gòu)的元數(shù)據(jù)模塊的任何代碼??蚣鼙旧硪惨設(shè)SGi的Bundle形式熱插拔到數(shù)據(jù)管理平臺(tái)中,所有可配置部分均存放在獨(dú)立的映射配置文件中。(2),框架在發(fā)生任何異常時(shí)自動(dòng)回滾之前已執(zhí)行的寫(xiě)操作,不僅保證了元數(shù)據(jù)的完整性和一致性,而且降低了事務(wù)控制等非功能性代碼對(duì)業(yè)務(wù)代碼的侵入性,從而有效提升數(shù)據(jù)管理平臺(tái)中各下層模塊代碼的可理解性與可維護(hù)性。(3),使用本框架開(kāi)發(fā)數(shù)據(jù)管理平臺(tái)中各下層模時(shí),能以實(shí)體對(duì)象的方式操作元數(shù)據(jù),使得代碼邏輯更易于理解,并提升了開(kāi)發(fā)者對(duì)數(shù)據(jù)涉及具體業(yè)務(wù)的關(guān)注度。(4),本框架使得數(shù)據(jù)管理平臺(tái)中各下層模塊可以遵循標(biāo)準(zhǔn)的JavaEE多層架構(gòu)開(kāi)發(fā),使得各層代碼清晰分離,對(duì)電網(wǎng)應(yīng)用的快速需求變更具有更高的適應(yīng)性。附圖說(shuō)明圖1為本發(fā)明功能及邏輯劃分圖。具體實(shí)施方式如圖1所示。一種通用的元數(shù)據(jù)/關(guān)系映射框架,邏輯結(jié)構(gòu)如下:映射配置的定義,編輯元數(shù)據(jù)/關(guān)系映射所必要的配置信息,配置信息保存在配置文件中;實(shí)體代理類(lèi)的生成,根據(jù)映射配置信息,生成與元數(shù)據(jù)中Tag對(duì)應(yīng)的實(shí)體代理類(lèi)的字節(jié)碼;DAO類(lèi)及其CRUD方法的生成,根據(jù)映射配置信息,為元數(shù)據(jù)各Tag生成對(duì)應(yīng)DAO類(lèi)(DataAccessObject)的CRUD(Create、Retrieve、Update、Delete)方法的字節(jié)碼,用于以面向?qū)ο蠛蜆I(yè)務(wù)相關(guān)的方式對(duì)元數(shù)據(jù)進(jìn)行增、刪、改、查操作;MQL語(yǔ)法分析,對(duì)用戶(hù)提交的類(lèi)SQL的MQL語(yǔ)句進(jìn)行語(yǔ)法分析,并提示語(yǔ)法錯(cuò)誤信息;結(jié)果集封裝與迭代,執(zhí)行用戶(hù)提交的MQL語(yǔ)句,并將返回結(jié)果集封裝為實(shí)體代理類(lèi)對(duì)象組成的列表以方便后續(xù)的迭代操作;事務(wù)管理,對(duì)元數(shù)據(jù)進(jìn)行更改的過(guò)程中,若發(fā)生任何錯(cuò)誤則自動(dòng)回滾數(shù)據(jù),以保證元數(shù)據(jù)的數(shù)據(jù)完整性。映射配置的定義過(guò)程如下:步驟1:?jiǎn)?dòng)映射配置定義模塊,選擇要操作的元數(shù)據(jù)格式;步驟2:定義元數(shù)據(jù)中的每個(gè)Tag對(duì)應(yīng)的實(shí)體類(lèi)名稱(chēng);步驟3:定義Tag下的每個(gè)Key對(duì)應(yīng)的字段名稱(chēng)和類(lèi)型;步驟4:根據(jù)元數(shù)據(jù)采用的三層HashMap的中層Map,定義其Key值對(duì)應(yīng)的組成字段,以作為后述實(shí)體類(lèi)的主鍵字段;步驟5:分析并校驗(yàn)以上映射配置是否合法。實(shí)體代理類(lèi)的生成過(guò)程如下:步驟1:讀取映射配置文件,獲取實(shí)體類(lèi)及其字段的信息;步驟2:根據(jù)映射配置信息,利用虛擬機(jī)字節(jié)碼生成工具,生成實(shí)體類(lèi)的字節(jié)碼,包括字段、主鍵字段、各字段的setter/getter方法;步驟3:結(jié)合動(dòng)態(tài)代理模式,為實(shí)體類(lèi)生成代理接口;步驟4:利用虛擬機(jī)字節(jié)碼生成工具,生成代理接口的實(shí)現(xiàn)類(lèi)。DAO類(lèi)及其CRUD方法的生成過(guò)程如下:步驟1:根據(jù)映射配置信息,利用虛擬機(jī)字節(jié)碼生成工具,為元數(shù)據(jù)各Tag生成對(duì)應(yīng)DAO類(lèi)的字節(jié)碼;步驟2:為實(shí)體類(lèi)各字段生成對(duì)應(yīng)的findBy方法,其以某個(gè)字段的值為查找條件,返回對(duì)應(yīng)Tag下相匹配的記錄行構(gòu)成的實(shí)體對(duì)象列表;步驟3:生成findByPK方法,其以主鍵字段的值為查找條件,返回對(duì)應(yīng)Tag下具有相同中層Key值的唯一記錄行對(duì)應(yīng)的實(shí)體對(duì)象;步驟4:生成findAll方法,其返回對(duì)應(yīng)Tag下所有記錄行構(gòu)成的實(shí)體對(duì)象列表;步驟5:生成findByConditions方法,其分別以指定的多個(gè)字段值和字段名作為組合查詢(xún)條件和排序依據(jù),返回對(duì)應(yīng)Tag下相匹配的記錄行經(jīng)過(guò)排序后構(gòu)成的實(shí)體對(duì)象列表;步驟6:生成update方法,其根據(jù)指定的實(shí)體對(duì)象的主鍵字段找到對(duì)應(yīng)Tag下具有相同中層Key值的唯一記錄行,并使用實(shí)體對(duì)象的各字段值更新該記錄行下的對(duì)應(yīng)Key值;步驟7:生成delete方法,其根據(jù)指定的實(shí)體對(duì)象的主鍵字段找到對(duì)應(yīng)Tag下具有相同中層Key值的唯一記錄行,并刪除該記錄行;步驟8:生成insert方法,其根據(jù)指定實(shí)體對(duì)象所屬的實(shí)體類(lèi)找到對(duì)應(yīng)的Tag,并在該Tag下新增一條記錄行,該記錄行的中層Key值為指定實(shí)體對(duì)象的主鍵字段值。通過(guò)框架提供的MQL語(yǔ)法分析、MQL語(yǔ)句執(zhí)行以及結(jié)果集封裝邏輯,數(shù)據(jù)管理平臺(tái)中下層模塊的開(kāi)發(fā)者可編寫(xiě)類(lèi)SQL語(yǔ)法的MQL語(yǔ)句以直接對(duì)元數(shù)據(jù)進(jìn)行CRUD操作。在對(duì)元數(shù)據(jù)進(jìn)行增、刪、改等寫(xiě)操作時(shí),元數(shù)據(jù)/關(guān)系映射框架通過(guò)AOP(Aspect-OrientedProgramming)技術(shù)自動(dòng)維護(hù)事務(wù)的開(kāi)啟和提交,并在發(fā)生任何異常時(shí)自動(dòng)回滾之前已執(zhí)行的寫(xiě)操作,保證了元數(shù)據(jù)的完整性和一致性,及降低了事務(wù)控制等非功能性代碼對(duì)業(yè)務(wù)代碼的侵入性,從而有效提升數(shù)據(jù)管理平臺(tái)中各下層模塊代碼的可理解性與可維護(hù)性。如圖1所示,本發(fā)明為一種通用的元數(shù)據(jù)/關(guān)系映射框架,可適配到電力數(shù)據(jù)管理平臺(tái)中現(xiàn)有的元數(shù)據(jù)模塊之上??蚣芙柚鷦?dòng)態(tài)代理和AOP等手段,對(duì)最原始的元數(shù)據(jù)增、刪、改、查等操作進(jìn)行了透明的面向?qū)ο蠓庋b,同時(shí)為以三層HashMap結(jié)構(gòu)存儲(chǔ)的元數(shù)據(jù)增添了關(guān)系模型所具備的能力和特征。實(shí)施例1,生成實(shí)體代理類(lèi)。首先,讀取映射配置文件,獲取實(shí)體類(lèi)及其字段的信息;然后,根據(jù)映射配置信息,利用虛擬機(jī)字節(jié)碼生成工具,生成實(shí)體類(lèi)的字節(jié)碼,包括字段、主鍵字段、各字段的setter/getter方法;接著,結(jié)合動(dòng)態(tài)代理模式,為實(shí)體類(lèi)生成代理接口;最后,生成代理接口的實(shí)現(xiàn)類(lèi)。實(shí)施例2,生成實(shí)體代理類(lèi)對(duì)應(yīng)的DAO類(lèi)及其CRUD方法。首先,根據(jù)映射配置信息,利用虛擬機(jī)字節(jié)碼生成工具,為元數(shù)據(jù)各Tag生成對(duì)應(yīng)DAO類(lèi)的字節(jié)碼;然后,為各DAO類(lèi)生成以字段值為查找條件的findBy方法、以主鍵字段為查找條件的findByPK方法、返回對(duì)應(yīng)Tag下所有記錄行構(gòu)成的實(shí)體對(duì)象列表的findAll方法、以多個(gè)字段值和字段名為組合查詢(xún)條件和排序依據(jù)的findByConditions方法;最后,分別生成用于修改、刪除和插入實(shí)體類(lèi)對(duì)象的update、delete和insert方法。