專利名稱:用于促進持久化應用編程接口的方法和裝置的制作方法
技術領域:
本發(fā)明涉及編程領域,更具體地,本發(fā)明涉及用于促進持久化應用編程接口的方
法和裝置。
背景技術:
為了改善性能和可擴展性,大部分基于web的應用都是使用多層架構構建的,其中基于web的應用分布在提供不同類型功能的多個服務器或集群(層)上。例如,典型的基于web的應用可以包括三個不同的獨立層表示層,其用作應用的前端,充當用戶與基于恥b的應用之間的媒介;業(yè)務層,或稱中間層,其包括基于web的應用的所有業(yè)務邏輯;以及持久層,其包括數據庫或其他存儲系統(tǒng)或設備。每一層獨立于其他層執(zhí)行,并且可以被替換或升級而不會有害地影響其他層。 盡管多層web應用有很多優(yōu)點,但是這些web應用還是存在若干問題的。例如,在
多數環(huán)境中,每一層由具有很少或沒有其他層的知識的不同群體來維護。例如,創(chuàng)建業(yè)務邏
輯的應用程序員通常不知道持久層的實現細節(jié)。而且,數據庫管理員通常不知道太多有關
業(yè)務邏輯的知識。當復雜操作涉及層之間的多次交互時,這可能會成問題。例如,如果對數
據庫中記錄的更新觸發(fā)了對第二表的連帶升級,則對第二表的補充升級可能需要由業(yè)務邏
輯來檢查,以確保此補充升級與已定義的業(yè)務約束和規(guī)則相兼容。在此示例中,持久層必須
將補充升級發(fā)送回中間層("向上調用"),從而中間層可以執(zhí)行此檢查。 在某些多層應用中,特定觸發(fā)器或被存儲的過程在持久層實現,從而在需要時對
業(yè)務層進行這些向上調用。然而,這些實現牽涉到層邊界的模糊化,并且會使組織束縛于特
定實現或持久層提供方。
發(fā)明內容
本發(fā)明的一個實施方式提供了一種用于實現持久化應用編程接口 (API)的系統(tǒng),所述持久化API是平臺獨立的并且能夠對業(yè)務邏輯進行向上調用。在操作期間,該系統(tǒng)在API處接收在n層分布式應用的持久層處執(zhí)行命令的請求。響應于所述請求,系統(tǒng)確定受該命令影響的實體的實體類型。接著,系統(tǒng)標識與該實體類型和命令相關聯的n層分布式應用的中間層處的函數,其中該中間層包括業(yè)務邏輯。系統(tǒng)繼而向中間層發(fā)送指令以執(zhí)行所述函數。最后,響應于在API處接收到有關函數已執(zhí)行的確認,系統(tǒng)在持久層處執(zhí)行所述命令。 在本發(fā)明的某些實施方式中,當系統(tǒng)向中間層發(fā)送所述指令以執(zhí)行函數時,系統(tǒng)還向中間層發(fā)送所述命令,其中該命令的一部分用作該函數的參數。 在本發(fā)明的某些實施方式中,系統(tǒng)在API處從中間層接收在持久層執(zhí)行第二命令的第二請求。 在本發(fā)明的某些實施方式中,響應于第二請求,系統(tǒng)確定受該第二命令影響的第二實體的第二實體類型。接著,系統(tǒng)標識與該第二實體類型和第二命令相關聯的n層分布式應用的中間層處的第二函數。系統(tǒng)繼而向中間層發(fā)送第二指令以執(zhí)行第二函數。最后,響應于在API處接收到有關第二函數已執(zhí)行的第二確認,系統(tǒng)在持久層處執(zhí)行第二命令。
在本發(fā)明的某些實施方式中,系統(tǒng)在API處創(chuàng)建包括指令和命令中的至少一個的事務。接著,系統(tǒng)確定在中間層處是否成功執(zhí)行函數以及在持久層處是否成功執(zhí)行命令。如果是,則系統(tǒng)提交(commit)事務。然而,如果否,則系統(tǒng)回退(rollback)事務。
在本發(fā)明的某些實施方式中,系統(tǒng)通過在持久層創(chuàng)建持久層子事務來創(chuàng)建事務。注意,提交事務包括提交持久層子事務,回退事務包括回退持久層子事務。
在本發(fā)明的某些實施方式中,持久層包括關系型數據庫。 在本發(fā)明的某些實施方式中,在標識n層分布式應用的中間層處的函數之前,系統(tǒng)在API處接收注冊,該注冊標識函數以及相關聯的實體類型和命令。 在本發(fā)明的某些實施方式中,標識中間層處的函數以及向中間層發(fā)送指令的步驟由協調代理(Orchestration Delegate)來處理,其中當滿足注冊條件時,協調代理命令執(zhí)行先前向API注冊的代碼。
圖1示出了根據本發(fā)明一個實施方式的計算環(huán)境;
圖2示出了根據本發(fā)明一個實施方式的裝置;以及 圖3提供了示出根據本發(fā)明一個實施方式、促進平臺獨立的并且能夠對業(yè)務邏輯進行向上調用的持久化應用編程接口 (API)的過程的相關聯流程圖。
具體實施例方式
提供以下描述以使得本領域任何技術人員能夠制造和使用本發(fā)明,其中在特定應用及其需求的上下文中提供此描述。對所公開的實施方式的各種變形對于本領域技術人員來說將是很明顯的,并且此處所定義的通用原理可以應用到其他實施方式和應用,而不偏離本發(fā)明的精神和范圍。因此,其意圖不在于將本發(fā)明限制在所示出的實施方式,而是按照與此處所公開的原理和特征相一致的最寬廣的范圍。 在此具體實施方式
部分描述的數據結構和代碼通常存儲在計算機可讀存儲介質上,計算機可讀存儲介質可以是能夠存儲代碼和/或數據以供計算機系統(tǒng)使用的任何設備或介質。計算機可讀存儲介質包括但不限于,易失性存儲器、非易失性存儲器、磁的和光學存儲設備,諸如磁盤驅動、磁帶、CD (緊致盤)、DVD (數字多功能盤或數字視頻盤),或者現在已知的或者以后開發(fā)的能夠存儲計算機可讀介質的其他介質。 在此具體實施方式
部分所描述的方法和過程可以具體化為代碼和/或數據,其可以存儲在上述計算機可讀存儲介質中。當計算機系統(tǒng)讀取并執(zhí)行這些存儲在計算機可讀存儲介質中的代碼或數據時,該計算機系統(tǒng)執(zhí)行這些具體化為數據結構和代碼并且存儲在計算機可讀存儲介質中的方法和過程。 此外,下文描述的方法和過程可以包括在硬件模塊中。例如,硬件模塊可以包括但不限于,專用集成電路(ASIC)芯片、現場可編程門陣列(FPGA)、以及現在已知的和以后開發(fā)的其他可編程邏輯器件。當激活硬件模塊時,這些硬件模塊執(zhí)行包括于其中的方法和過程。
概述 本發(fā)明的一個實施方式提供了一種用于實現持久化應用編程接口 (API)的系統(tǒng),該持久化API是平臺獨立的并且能夠對業(yè)務邏輯進行向上調用。在操作期間,該系統(tǒng)在API處接收請求,以在n層分布式應用的持久層處執(zhí)行命令。響應于該請求,系統(tǒng)確定受該命令影響的實體的實體類型。接著,系統(tǒng)標識與該實體類型和命令相關聯的n層分布式應用的中間層處的函數,其中該中間層包括業(yè)務邏輯。系統(tǒng)繼而向中間層發(fā)送指令以執(zhí)行所述函數。最后,響應于在API處接收到有關函數已執(zhí)行的確認,系統(tǒng)在持久層處執(zhí)行所述命令。
例如,對持久層的所有調用可以由持久化API來處理。持久化API支持基于web的應用將數據保存到數據庫,并且在如此操作時,執(zhí)行檢查有效性的業(yè)務邏輯、做簿記,等等。持久化API使得有可能從持久層調用中間層邏輯,這實際上是從較低層到較高層的向上調用。進行這些向上調用,而編寫中間層代碼的程序員無需具有關于持久層的實現的任何知識。注意,持久層API使得中間層邏輯不必知曉持久層的細節(jié)。此外,持久層API使得基于web的應用能夠在數據庫、對象關系(OR)映射器、語言(諸如JavaTM和C弁⑧)以及平
臺(諸如Windows⑧和Unix⑧)保留可移植性。 在本發(fā)明的某些實施方式中,當系統(tǒng)向中間層發(fā)送指令以執(zhí)行函數時,系統(tǒng)還向
中間層發(fā)送命令,其中該命令的一部分用作該函數的參數。 在本發(fā)明的某些實施方式中,系統(tǒng)在API處從中間層接收在持久層執(zhí)行第二命令的第二請求。注意,盡管中間層正在執(zhí)行與所述命令相關聯的代碼,但是中間層可以向持久化API發(fā)送附加請求。而且,這些附加請求的每一個甚至可以轉而引起更多的附加請求。
在本發(fā)明的某些實施方式中,響應于第二請求,系統(tǒng)確定受該第二命令影響的第二實體的第二實體類型。接著,系統(tǒng)標識與該第二實體類型和第二命令相關聯的n層分布式應用的中間層處的第二函數。系統(tǒng)繼而向中間層發(fā)送第二指令以執(zhí)行第二函數。最后,響應于在API處接收到有關第二函數已執(zhí)行的第二確認,系統(tǒng)在持久層處執(zhí)行第二命令。
在本發(fā)明的某些實施方式中,系統(tǒng)在API處創(chuàng)建包括指令和命令中的至少一個的事務。接著,系統(tǒng)確定在中間層處是否成功執(zhí)行函數以及在持久層處是否成功執(zhí)行命令。如果是,則系統(tǒng)提交該事務。然而,如果否,則系統(tǒng)回退該事務。注意,事務是從持久化API創(chuàng)建、提交和回退的。 在本發(fā)明的某些實施方式中,系統(tǒng)通過在持久層創(chuàng)建持久層子事務來創(chuàng)建事務。注意,提交事務包括提交持久層子事務,回退事務包括回退持久層子事務。在這些實施方式中,持久化API利用數據庫的已有事務框架。 在本發(fā)明的某些實施方式中,持久層包括關系型數據庫。注意,盡管本發(fā)明的多數實施方式使用關系型數據庫,但是通??梢允褂萌魏晤愋偷臄祿鎯ΑT谀承嵤┓绞街?,這可以包括基于XML的文件管理系統(tǒng)。 在本發(fā)明的某些實施方式中,在標識在n層分布式應用的中間層處的函數之前,系統(tǒng)在API處接收注冊,該注冊標識函數以及相關聯的實體類型和命令。注意,程序員僅需要注冊具有相關聯的實體類型和命令特定函數,而無需知道有關持久層任何其他知識。
例如,程序員可以注冊這樣的特定函數,當API接收到向客戶表輸入新記錄的命令時,其應用用于添加新客戶的業(yè)務規(guī)則。 在本發(fā)明的某些實施方式中,標識中間層處的函數以及向中間層發(fā)送指令的步驟由協調代理來處理,其中當滿足注冊條件時,協調代理命令執(zhí)行先前向API注冊的代碼。
注意,當命令在API處執(zhí)行時,協調代理主動地將這些指令派送給中間層。備選 地,系統(tǒng)可以使用注冊模型以代替協調代理,其中中間層處的函數被配置為監(jiān)聽API處的 特定事件。 在本發(fā)明的一種實施方式中,稱為"存儲庫"的API是用于所有持久操作的公共 API。此API的實現分析普通對象和實體的進入圖形;確定哪些項目是新的,哪些項目是 對已有項目的更新;交換合成父母的合成孩子;施加約束;以及調用執(zhí)行實際持久操作(創(chuàng) 建、讀取、更新以及刪除)的邏輯代理。邏輯代理還調用中間層邏輯,其實現為向系統(tǒng)注冊 的一個或多個協調原子。中間層邏輯可以任意執(zhí)行復雜操作,包括對存儲庫進行附加調用。 存儲庫也處理啟動、提交和回退事務。
計算環(huán)境 圖1示出了根據本發(fā)明一個實施方式的計算環(huán)境100。計算環(huán)境100包括多個計 算機系統(tǒng),其通??梢园ɑ谖⑻幚砥?、大型計算機、數字信號處理器、便攜式計算設備、 個人記事本、設備控制器、或器件內的計算引擎的任意類型的計算機系統(tǒng)。更具體地,參考 圖l,計算環(huán)境100包括客戶端110-112、用戶120和121、服務器130-150、網絡160、數據庫 170、設備180以及器件190。 客戶端110-112可以包括網絡上的任何節(jié)點,其包括計算能力并且包括用于通過 網絡進行通信的機制。此外,客戶端110-112可以包括n層應用架構中的一層,其中客戶端 110-112可以作為服務器(為來自較低層或用戶的請求提供服務),并且客戶端110-112可 以作為客戶端(將請求轉發(fā)給更高層)。 類似地,服務器130-150通??梢园ňW絡上的任何節(jié)點,其包括用于為來自客 戶端的對計算和/或數據存儲資源的請求提供服務的機制。服務器130-150可以加入高等 計算集群,或者可以作為單機服務器。在本發(fā)明的一種實施方式中,服務器140是服務器 150的在線"熱備件"。 用戶120和121可以包括個人;個人群體;組織;組織群體;計算系統(tǒng);計算系統(tǒng) 群體;或可以與計算環(huán)境100交互的任何其他實體。 網絡160可以包括能夠將計算節(jié)點耦合到一起的任何類型的有線或無線通信信
道。這包括但不限于,局域網、廣域網或網絡的組合。在本發(fā)明的一種實施方式中,網絡160
包括互聯網。在本發(fā)明的某些實施方式中,網絡160包括電話和蜂窩電話網絡。 數據庫170可以包括用于在非易失性存儲設備中存儲數據的任何類型的系統(tǒng)。這
包括但不限于,基于磁的、光的或光磁存儲設備的系統(tǒng),以及基于閃存和/或電池供電存儲
器的存儲設備。注意,數據庫170可以耦合至服務器(諸如服務器150)、客戶端、或直接
耦合至網絡。 設備180可以包括能夠耦合至客戶端(諸如客戶端112)的任何類型的電子設備。 這包括但不限于,蜂窩電話、個人數字助理(PDA)、智能手機、個人音樂播放器(諸如MP3播 放器)、游戲系統(tǒng)、數字相機、便攜式存儲介質、或能夠耦合至客戶端的任何其他設備。注 意,在本發(fā)明的某些實施方式中,設備180可以直接耦合至網絡160并且可以以與客戶端 110-112相同的方式工作。 器件190可以包括能夠耦合至網絡160的任何類型的器件。這包括但不限于,路由器、交換機、負載平衡器、網絡加速器、以及專用處理器。器件190可以用作服務器140和 網絡160之間的網關、代理或轉譯器。 注意,本發(fā)明的不同實施方式可以使用不同的系統(tǒng)配置,并且不限于計算環(huán)境IOO 中示出的系統(tǒng)配置。 一般而言,能夠經由網絡160通信的任何設備可以包含本發(fā)明的元件。
例如,在本發(fā)明的一個實施方式中,用戶120使用客戶端110來訪問服務器140和 150上容納的n層基于web的應用以及數據庫170。在此實施方式中,服務器140用作表現 層,其處理與用戶120和客戶端110的所有交互。此外,服務器150包含業(yè)務層或中間層, 并且包括所有業(yè)務邏輯。最后,數據庫170包含持久層,并且為基于web的應用提供數據存 儲。 驢 圖2示出了裝置200,圖3提供了示出根據本發(fā)明一個實施方式、促進平臺獨立的 并且能夠對業(yè)務邏輯進行向上調用的持久化應用編程接口 (API)的過程的相關聯流程圖。
裝置200例如可以包含服務器150、數據庫170、器件190、客戶端110、設備180 或其任意組合,其包括接收機制202、確定機制204、標識機制206、發(fā)送機制208、執(zhí)行機制 210、處理器214以及存儲器216。 在操作期間,接收機制202在API處接收請求,以在n層分布式應用的持久層處執(zhí) 行命令(操作302)。接著,確定機制204響應于該請求,確定受該命令影響的實體的實體類 型(操作304)。例如,命令可以包括對雇員記錄進行更新以調整該雇員的薪水。在此示例 中,實體類型可以是雇員表。 繼而,標識機制206標識與該實體類型和命令相關聯的n層分布式應用的中間層 處的函數(操作306),其中該中間層包括業(yè)務邏輯。例如,此函數可以檢查薪水在允許的范 圍內并且發(fā)布命令的人員有足夠的權利這么做。 此時,API可以可選地啟動事務(操作307)。在本發(fā)明的某些實施方式中,如前面 所描述的,API可以利用作為數據庫170的一部分的已有事務系統(tǒng)。 接著,發(fā)送機制208向中間層發(fā)送指令以執(zhí)行所述函數(操作308)。響應于在API 處接收到有關函數已執(zhí)行的確認,執(zhí)行機制210在持久層處執(zhí)行所述命令(操作310)。最 后,如果API之前啟動了事務,并且如果所述函數和命令都已成功執(zhí)行,則API提交此事務 (操作312)。 示例性實施方式 以下部分描述了僅用于示例性目的的本發(fā)明的一個實施方式。
注意,其意圖不在于將本發(fā)明限于此實施方式中描述的細節(jié)。 此實施方式提供了一種系統(tǒng),其中對象的持久化由實體服務API來控制,實體服 務調用Hibernate以執(zhí)行CRUD(創(chuàng)建、讀取、更新、刪除)操作。 注意,Hibernate通過使用其用于檢測臟對象以及可到達即持久化 (persistence-by-reachability)的內部機制(其中,其自動確定對整個對象圖形或一組 對象圖形中的元素進行CRUD需要完成哪些)來確定創(chuàng)建、更新和刪除的內容。
存儲庫是用于可擴展數據訪問層的公共API ,并且是實體服務之上的抽象層,其不 會為了創(chuàng)建、更新或刪除操作而直接調用實體服務。相反,存儲庫通過調用創(chuàng)建、更新和刪 除CRUD協調來執(zhí)行創(chuàng)建、更新和刪除。
8
注意,CRUD協調是ICrudDelegate接口的實現,在存儲庫項目中定義了 ICrudDelegate接口。 CRUD協調代理接口非常簡單,其類似于
public interface ICrudDelegate
{ 在系統(tǒng)啟動期間,CRUD協調代理實現由協調初始化代碼代理到存儲庫中。當調用 存儲庫操作時,存儲庫檢查以查看存儲庫中是否有CRUD協調代理。如果沒有CRUD協調代 理,則存儲庫執(zhí)行CRUD操作而不執(zhí)行協調。然而,如果有CRUD協調代理,則存儲庫與CRUD 協調代理一起工作以正確執(zhí)行確認有效性邏輯、其他業(yè)務邏輯以及CRUD操作。
對于合成關系,系統(tǒng)可以令Hibernate來持久化對象圖形。系統(tǒng)可以這么做是因 為系統(tǒng)僅定義了用于合成父母的CRUD協調。 對于數據對象的關聯,以及對于數據類型的哈希映射,系統(tǒng)令Hibernate持久化 圖形。系統(tǒng)可以這么做是因為CRUD協調從來沒有被定義用于數據對象或數據類型。然而, 對于實體之間的關聯,系統(tǒng)定義了用于關聯的兩端的CRUD協調,并且運行這兩個CRUD協 調。注意,這要求協調由Hibernate執(zhí)行的CRUD協調運行和操作以便聯結關聯的持久化。
以下討論描述了存儲庫如何管理CRUD協調的運行以及用于所呈現的實體的對象 圖形閉包的Hibernate持久化以保存和刪除API的細節(jié)。
需求和用例 首先,系統(tǒng)可以理想地提供API,此API具有直觀行為、易于使用并且產生正確結 果。這是頂級要求。此部分中列出的其他一切旨在于為存儲庫API的客戶端滿足此要求。 例如,API的客戶端可以進行以下操作 1.創(chuàng)建新的顧客實體,包括保存指向新顧客實體的發(fā)票(新的或以前保存的)。
2.更新以前保存的顧客實體,包括改變存儲器中以前保存的顧客實體、從發(fā)票關 聯到該顧客實體以及保存此發(fā)票。 3.更新以前保存的、已經與發(fā)票相關聯的顧客實體,包括改變存儲器中的顧客實 體以及保存該發(fā)票。 系統(tǒng)也可以運行一個事務下的整套操作。存儲庫需要在調用存儲庫操作(例如, 保存)的開始時啟動事務,并且在該調用結束時提交此事務。如果在操作期間任何點處發(fā) 生錯誤,存儲庫需要回退整個事務。 系統(tǒng)也可以在將陣列遞交給CRUD協調代理之前,移除重復的實體。在實體和數據 對象的重要圖形中,有可能(事實上,很可能)同一實體可由不止一條通過圖形的路徑到 達。例如,兩個不同的發(fā)票實體可以指向同一顧客實體。 為了避免對協調邏輯的過多調用,存儲庫可以在將陣列遞交給CRUD協調代理之 前,將所有復制品從所有陣列中移除,從而使每個不同實體被協調引擎確切地只看到一次。
系統(tǒng)可以被配置為僅遞交新實體以創(chuàng)建協調。遞交給CRUD協調代理創(chuàng)建方法的
public Entity[]create(Entity[]entities);陣列應當僅包含新實體(以前從未被保存到數據庫的實體)。 系統(tǒng)應當僅遞交之前保存的、目前是臟的實體以便更新協調。 注意,遞交給CRUD協調代理更新方法的陣列應當僅包含以前已經保存到數據庫 并且現在臟了的實體。如果實體的任何簡單屬性已經改變,或者如果其任何l : l關系已 經從非空改變?yōu)榭?假設它們可以為空)或者從空改變?yōu)榉强?,或者如果其任何匯集關系 已經添加或刪除了元素,則此實體是臟的。 例如,如果源實體與目標實體之間的單向關聯不再存在,則存儲庫可以將源實體 遞交給CRUD協調代理以進行更新。類似地,如果兩個實體之間的雙向關聯不再存在,則存 儲庫可以將兩個實體都遞交給CRUD協調代理以進行更新。注意,這暗示著關系(l : l和 1比多)應當跟蹤添加的和刪除的元素。 系統(tǒng)應當僅遞交以前保存的實體以刪除協調。而且,遞交給CRUD協調代理刪除方 法的陣列應當僅包含以前已經保存到數據庫的實體。實體可以基于以下兩個原因之一而被 刪除 1. API客戶端明確調用對該實體的存儲庫刪除。 2.實體是從合成關系(1 : 1或1比多)移除的合成孩子,并且保存了合成父母, 這需要觸發(fā)對所移除的實體的刪除。 系統(tǒng)可以運行沿著用于實體的繼承路徑定義的CRUD協調。例如,實體類可以是 其他實體類的子類,直到建模器指定的任何深度。當對其繼承路徑中具有父類的實體執(zhí)行 CRUD時,可以在此實體上運行針對此父類定義的CRUD協調。換言之,協調可以多形態(tài)地運 行。 注意,存儲庫不能實現此要求,因為其沒有要遞交到CRUD協調代理中的父實體實 例。相反,通過沿著繼承路徑走以及運行為路徑中每個實體類定義的協調,此要求可以完全 實現在協調CRUD協調代理內。 系統(tǒng)還可以防止刪除新實體。當對新實體調用存儲庫刪除時,其可能拋出異常。 (注意,這已經由實體服務處理了。) 系統(tǒng)可以遞交擴展實體,來代替對CRUD協調代理的擴展。當對擴展執(zhí)行CRUD操 作時,存儲庫可以用其擴展實體來替換擴展,以及將擴展實體遞交給CRUD協調代理,而不 是給它原始擴展。此要求存在兩個原因 1.擴展可以是特定實體的n個擴展之一。為了 CRUD協調能夠正確地運行,這些 CRUD協調應當不僅僅在擴展上運行,而是還在擴展實體上運行,并且在擴展實體的所有其 他擴展上運行。通過翻轉對其在調用CRUD協調代理之前擴展的實體的擴展,所有協調都正 確地運行。注意,這要求協調擴展適當地工作。 2.在合成中,與擴展實體相關聯的協調可以被撤消,不過這不會正確地工作,除非 擴展實體(而不是擴展)傳遞到CRUD協調代理中。 系統(tǒng)也應當僅將合成父實體遞交給CRUD協調代理。當對新的或臟的合成子實體 調用存儲庫保存或刪除時,存儲庫應當用父實體替換子實體,并且將父實體遞交給CRUD協 調代理,而不是給它子實體。如果父實體是新的,則存儲庫可以將父實體遞交給CRUD協調 代理以進行創(chuàng)建。如果父實體不是新的,則存儲庫可以將父實體遞交給CRUD協調代理以進 行更新。
如果擁有子實體的實體本身在合成關系中是孩子,那么存儲庫可以將此父母的父 母給予CRUD協調代理,而不是將父母給予它,依此類推,直到合成關系的傳遞閉包向上到 盡頭為止。應當僅將合成鏈的最終父母給CRUD協調代理以進行更新或創(chuàng)建。
例如,如果A擁有B,B擁有C,則應當僅有為A定義的協調,并且此協調需要處理B 和C 二者所需的任何業(yè)務邏輯。 注意,此要求包含了之前有關擴展的要求,因為擴展被映射為雙向1 : l合成,其 中擴展作為孩子。然而,由于協調應當在擴展實體的所有擴展上運行的子要求,因此明確調 出擴展用例非常重要。 遵從根實體的持久化而運行CRUD協、i周 此部分概述用于運行CRUD協調以作為存儲庫持久化操作的一部分的修訂方法。 用于驅動實體對象的自動CRUD協調的初始設計路徑,提供給存儲庫保存和刪除操作,涉及
從所提供對象的圖形閉包中收集所有候選實體對象以及在同類實體類型的批量中將它們 遞送給CRUD協調代理,其中實體服務持久化操作和CRUD協調二者都將執(zhí)行。
緊密耦合的實體持久化和CRUD協調對于遞送到存儲庫保存和刪除方法的每個實 體對象都能很好地工作。然而,當嘗試為作為在保存或刪除操作中遞送到存儲庫的實體的 對象圖形閉包的一部分而間接持久化的實體執(zhí)行CRUD協調時,產生了疑問。目的為隱含持 久化的實體可以很容易地從輸入實體的對象圖形閉包中標識出來。問題是如何將這種實體 遞送給CRUD協調代理,其中要執(zhí)行CRUD協調和持久化二者而不引起持久層中的沖突。例 如,如果已經持久化為保存輸入實體的一部分,那么保存在遞送給存儲庫.保存(T)的對象 圖形閉包中發(fā)現的新實體將產生異常。 代替于引入對持久化配置的約束或者施加對允許的自動CRUD協調的擴展的限 制,可選設計最大化了針對所有受存儲庫保存和刪除操作影響的實體的自動CRUD協調的 運行。此思想是通過兩步驟處理實體,其中在任何給定時刻僅有單個實體被遞送到CRUD協 調代理。首先,系統(tǒng)針對提供給存儲庫操作的每個實體執(zhí)行持久化和CRUD協調。實際上, 遞送給CRUD協調代理的實體事實上可以是合成根父母(如果所提供的實體是合成孩子的 話),或者是所提供實體擴展的擴展實體。在此步驟中,轉送給CRUD協調代理的實體可以稱 為"根實體"。注意,根實體已被持久化,并且執(zhí)行注冊的CRUD協調。 在這點上,用于被間接持久化的實體的CRUD協調尚未執(zhí)行并且有待處理。記住, 它們被持久化為根實體持久化的一部分。第二步驟包括將這些實體的每一個發(fā)送給CRUD 協調代理。在這么做時,實體解除CRUD協調,并且被第二次遞送給持久化管理器。在已有 實體已經更新過并且正在等待再次更新的情況下,Hibernate會在同一事務內將更新請求 合并成一個?;旧希诙4孀?yōu)榭詹僮?。持久化沖突可能仍然會產生,諸如在新實體被 較早地間接持久化為根實體保存操作的一部分的情況中。辨認與已經持久化的實體的持久 化的各種類型的沖突以及圍繞其進行編碼支持自動CRUD協調的更大覆蓋。
根實體的對象圖形閉包中的新實體(其在保存根實體時就已經持久化)不應當在 同一事務中再次呈現給持久層。在CRUD協調代理內,可以檢查實體isNew()的值。如果該 值為真并且實體也具有ID值(其指示在較早的保存中創(chuàng)建了實例),則其已經運行了 CRUD 協調并且不再被持久化。 在提供實體的輸入陣列的存儲庫保存和刪除操作中,對于復制實例而言,也有可能顯式地出現在陣列元素中,或者隱式地出現在陣列中的實體的對象圖形閉包中。除非被 處理,否則復制實例可以得到針對同一實體的CRUD協調的多個運行。存儲庫標識復制實 體,并且在遇到異常時拋出異常,以幫助調用方供應實體(無需復制品)給存儲庫。
刪除根實體的對象圖形閉包中的相關聯實體可能破壞關系的語義。例如,刪除 發(fā)票不應當導致移除與其相關聯的顧客。存儲庫將只刪除根實體,因此僅在其上允許 CRUD(也即,刪除)協調。這意味著,根實體的對象圖形閉包中移除或更新的實體跟隨根實 體的刪除,其不會使CRUD協調運行。 針對合成孩子調用刪除操作將會拋出異常。存儲庫可以跳過孩子到其根父母,并 且對其調用刪除,導致刪除父母及其所有孩子。這不應該是調用方的本意。如果刪除應當 孩子,則應該通過移除指定孩子來修改父母并繼而保存。 發(fā)送到存儲庫保持操作的新的合成孩子應當僅是父實體的新孩子。當在相同父母 下創(chuàng)建不止一個新子實體時,不可能確定合適的子實體。如果這種情況出現的話,則拋出 InvalidOperationExc印tion (無效操作異常)。
訪客 可以實現訪客以標識遞送到存儲庫保存和刪除方法的實體的對象圖形閉包中新 的或更新的實體。訪客實現IEntity訪客。對于保存和刪除兩種情況,訪客可以
1.提供在保存和刪除模式之間切換的方式。 2.遍歷遞送到保存(實體)/刪除(實體)方法中的整個對象圖形、以及遞送到保 存(實體[])/刪除(實體[])方法中的整個對象圖形的整個陣列,同時執(zhí)行循環(huán)檢測以避 免訪問任何節(jié)點超過一次(已經是EntityCommon中訪客實現的一部分)。
3.分析對象圖形中的節(jié)點以標識和收集應當遞送到CRUD協調代理的實體。
對于保存,訪客將 1.除去作為擴展的實體之外,在未設置唯一 ID的每個實體中設置唯一 ID。
2.將新實體置入特定于每個實體確切類型的創(chuàng)建陣列中。 3.將之前保存的、現在臟了的實體置入特定于每個實體確切類型的更新陣列中。
4.確定每個實體在整個陣列集合中只出現一次。
5.利用擴展所擴展的內容來替換擴展。 6.利用合成子實體的父實體來傳遞性地替換這些合成子實體,直到到達最終父 母。 7.使得所收集的陣列實體對于存儲庫可用。 對于刪除,訪客可以確定對象圖形閉包中的實體是否是新的,以支持存儲庫拋出 異常。注意,實體服務已經實現了這個,不過如果系統(tǒng)可以較早抓住錯誤,那么將整個圖形 發(fā)送給服務器就太浪費了。
存儲庫行為 當調用存儲庫保存時,存儲庫可以
1.啟動事務。 2.創(chuàng)建訪客并將其置入保存模式。 3.在一個或多個輸入實體或實體上運行該訪客。 4.翻轉標識為對擴展實體的可擴展的根實體。
12
5.翻轉標識為根合成父母的合成孩子的根實體。 6.將根實體遞交給CRUD協調代理更新或創(chuàng)建方法。 7.將訪客所標識的每個實體遞交給CRUD協調代理更新或創(chuàng)建方法。 8.提交事務以完成實體對數據庫的持久化。 9.將保存的實體/多個實體返回給調用方。 當調用存儲庫刪除時,存儲庫可以 1.啟動事務。 2.創(chuàng)建訪客并將其置入刪除模式。 3.如果在對象圖形閉包中發(fā)現新實體,則在根實體上運行訪客以拋出異常。 4.對于刪除(實體[]),如果在對象圖形閉包中發(fā)現復制實體,則拋出異常。 5.將根實體遞交給CRUD協調代理刪除方法。 6.提交事務。 跑 在處理用于保存和刪除操作的輸入實體中,存儲庫標識多個新的錯誤情形。在每 種情況中,拋出InvalidOperationExc印tion(無效操作異常)。異常被存儲庫抓住以便回 退針對保存或刪除操作初始發(fā)起的事務。注意,異常詳述了 1.新實體被提供給刪除操作。 2.在提供給保存操作的實體的對象圖形閉包中發(fā)現了沒有合成父實例的合成孩 子。 3.合成孩子被提供給刪除操作。假定存儲庫總是翻跳到父母,則刪除父母不太適合。 4.在提供給保存操作的一個或多個實體的對象圖形閉包中發(fā)現同一實體實例多 次出現。 5.在提供給保存操作的實體的對象圖形閉包中發(fā)現未解決的實體。 6.不能返回對應于提供給保存操作的實體的已保存對象。 僅出于示例性和描述性的目的提供了本發(fā)明的實施方式的前述描述。其意圖不在 于窮盡或將本發(fā)明限制于所公開的形式。相應地,對于本領域的技術實踐者而言,多種修改 和變形是很明顯的。此外,上述公開不在于限制本發(fā)明。本發(fā)明的范圍由所附權利要求來 定義。
權利要求
一種用于實現持久化應用編程接口(API)的方法,所述持久化API是平臺獨立的并且能夠對業(yè)務邏輯進行向上調用,所述方法包括在所述API處接收在n層分布式應用的持久層處執(zhí)行命令的請求;響應于所述請求,確定受所述命令影響的實體的實體類型;標識與所述實體類型和所述命令相關聯的、所述n層分布式應用的中間層處的函數,其中所述中間層包括所述業(yè)務邏輯;向所述中間層發(fā)送指令以執(zhí)行所述函數;以及響應于在所述API處接收到有關所述函數已執(zhí)行的確認,在所述持久層處執(zhí)行所述命令。
2. 如權利要求l的方法,其中向所述中間層發(fā)送所述指令還包括向所述中間層發(fā)送所述命令,其中所述命令的一部分用作所述函數的參數。
3 如權利要求1的方法,還包括在所述API處從所述中間層接收在所述持久層執(zhí)行第二命令的第二請求。
4. 如權利要求3的方法,還包括響應于所述第二請求,確定受所述第二命令影響的第二實體的第二實體類型;標識與第二實體類型和第二命令相關聯的、所述n層分布式應用的所述中間層處的第二函數;向中間層發(fā)送第二指令以執(zhí)行第二函數;以及響應于在API處接收到有關第二函數已執(zhí)行的第二確認,在持久層執(zhí)行第二命令。
5. 如權利要求1的方法,還包括在所述API處創(chuàng)建包括所述指令和所述命令中的至少一個的事務;確定在中間層處是否成功執(zhí)行所述函數以及在持久層處是否成功執(zhí)行所述命令;如果是,則提交所述事務;以及如果否,則回退所述事務。
6. 如權利要求5的方法,其中創(chuàng)建所述事務可以包括在持久層處創(chuàng)建持久層子事務,其中提交所述事務包括提交所述持久層子事務,并且回退所述事務包括回退所述持久層子事務。
7. 如權利要求l的方法,其中所述持久層包括關系型數據庫。
8. 如權利要求l的方法,其中在標識在所述n層分布式應用的中間層處的所述函數之前,所述方法還包括在API處接收注冊,該注冊標識所述函數以及相關聯的實體類型和命令。
9. 如權利要求1的方法,其中標識中間層處的所述函數以及向中間層發(fā)送所述指令的步驟由協調代理來處理,其中當滿足注冊條件時,所述協調代理命令執(zhí)行先前向API注冊的代碼。
10. —種用于實現持久化應用編程接口 (API)的設備,所述持久化API是平臺獨立的并且能夠對業(yè)務邏輯進行向上調用,所述設備包括用于在所述API處接收在n層分布式應用的持久層處執(zhí)行命令的請求的裝置;用于響應于所述請求,確定受所述命令影響的實體的實體類型的裝置;用于標識與所述實體類型和所述命令相關聯的、所述n層分布式應用的中間層處的函數的裝置,其中所述中間層包括所述業(yè)務邏輯;用于向所述中間層發(fā)送指令以執(zhí)行所述函數的裝置;以及用于響應于在所述API處接收到有關所述函數已執(zhí)行的確認,在所述持久層處執(zhí)行所述命令的裝置。
11. 如權利要求10的設備,其中用于向所述中間層發(fā)送所述指令的裝置還包括用于向所述中間層發(fā)送所述命令的裝置,其中所述命令的一部分用作所述函數的參數。
12. 如權利要求10的設備,其中所述設備還包括用于在所述API處從所述中間層接收在所述持久層執(zhí)行第二命令的第二請求的裝置。
13. 如權利要求12的設備,還包括用于響應于所述第二請求,確定受所述第二命令影響的第二實體的第二實體類型的裝置;用于標識與第二實體類型和第二命令相關聯的、所述n層分布式應用的所述中間層處的第二函數的裝置;用于向中間層發(fā)送第二指令以執(zhí)行第二函數的裝置;以及用于響應于在API處接收到有關第二函數已執(zhí)行的第二確認,在持久層執(zhí)行第二命令的裝置。
14. 如權利要求10的設備,還包括用于在所述API處創(chuàng)建包括所述指令和所述命令中的至少一個的事務的裝置;用于確定在中間層處是否成功執(zhí)行所述函數以及在持久層處是否成功執(zhí)行所述命令的裝置;用于如果是,則提交所述事務的裝置;以及用于如果否,則回退所述事務的裝置。
15. 如權利要求14的設備,其中用于創(chuàng)建所述事務的裝置可以包括用于在持久層處創(chuàng)建持久層子事務的裝置,其中用于提交所述事務的裝置包括用于提交所述持久層子事務的裝置,并且用于回退所述事務的裝置包括用于回退所述持久層子事務的裝置。
16. 如權利要求10的設備,其中所述持久層包括關系型數據庫。
17. 如權利要求10的設備,其中在標識在所述n層分布式應用的中間層處的所述函數之前,所述設備還包括用于在API處接收注冊的裝置,該注冊標識所述函數以及相關聯的實體類型和命令。
18. 如權利要求10的設備,其中用于標識中間層處的所述函數的裝置以及用于向中間層發(fā)送所述指令的裝置由協調代理來處理,其中當滿足注冊條件時,所述協調代理命令執(zhí)行先前向API注冊的代碼。
全文摘要
本發(fā)明涉及用于促進持久性持久化應用編程接口的方法和裝置。一種實施方式提供了一種用于實現持久化應用編程接口(API)的系統(tǒng),所述持久化API是平臺獨立的并且能夠對業(yè)務邏輯進行向上調用。在操作期間,該系統(tǒng)在API處接收在n層分布式應用的持久層處執(zhí)行命令的請求。響應于所述請求,系統(tǒng)確定受該命令影響的實體的實體類型。接著,系統(tǒng)標識與該實體類型和命令相關聯的n層分布式應用的中間層處的函數,其中該中間層包括業(yè)務邏輯。系統(tǒng)繼而向中間層發(fā)送指令以執(zhí)行所述函數。最后,響應于在API處接收到有關函數已執(zhí)行的確認,系統(tǒng)在持久層處執(zhí)行所述命令。
文檔編號G06F9/46GK101727318SQ20091017899
公開日2010年6月9日 申請日期2009年10月9日 優(yōu)先權日2008年10月10日
發(fā)明者C·默里, J·科林斯, J·肖沃爾特, R·A·盧本, R·J·查普曼 申請人:因特偉特公司