用于促进持久化应用编程接口的方法和装置的制造方法

文档序号:10724732阅读:238来源:国知局
用于促进持久化应用编程接口的方法和装置的制造方法
【专利摘要】本公开涉及用于促进持久性持久化应用编程接口的方法和装置。一种实施方式提供了一种用于实现持久化应用编程接口(API)的系统,所述持久化API是平台独立的并且能够对业务逻辑进行向上调用。在操作期间,该系统在API处接收在n层分布式应用的持久层处执行命令的请求。响应于所述请求,系统确定受该命令影响的实体的实体类型。接着,系统标识与该实体类型和命令相关联的n层分布式应用的中间层处的函数,其中该中间层包括业务逻辑。系统继而向中间层发送指令以执行所述函数。最后,响应于在API处接收到有关函数已执行的确认,系统在持久层处执行所述命令。
【专利说明】
用于促进持久化应用编程接口的方法和装置
[00011 本申请是申请日为2009年10月9日、申请号为200910178995.X的发明专利申请的 分案申请。
技术领域
[0002] 本发明涉及编程领域,更具体地,本发明涉及用于促进持久化应用编程接口的方 法和装置。
【背景技术】
[0003] 为了改善性能和可扩展性,大部分基于web的应用都是使用多层架构构建的,其中 基于web的应用分布在提供不同类型功能的多个服务器或集群(层)上。例如,典型的基于 web的应用可以包括三个不同的独立层:表示层,其用作应用的前端,充当用户与基于web的 应用之间的媒介;业务层,或称中间层,其包括基于web的应用的所有业务逻辑;以及持久 层,其包括数据库或其他存储系统或设备。每一层独立于其他层执行,并且可以被替换或升 级而不会有害地影响其他层。
[0004] 尽管多层web应用有很多优点,但是这些web应用还是存在若干问题的。例如,在多 数环境中,每一层由具有很少或没有其他层的知识的不同群体来维护。例如,创建业务逻辑 的应用程序员通常不知道持久层的实现细节。而且,数据库管理员通常不知道太多有关业 务逻辑的知识。当复杂操作涉及层之间的多次交互时,这可能会成问题。例如,如果对数据 库中记录的更新触发了对第二表的连带升级,则对第二表的补充升级可能需要由业务逻辑 来检查,以确保此补充升级与已定义的业务约束和规则相兼容。在此示例中,持久层必须将 补充升级发送回中间层("向上调用"),从而中间层可以执行此检查。
[0005] 在某些多层应用中,特定触发器或被存储的过程在持久层实现,从而在需要时对 业务层进行这些向上调用。然而,这些实现牵涉到层边界的模糊化,并且会使组织束缚于特 定实现或持久层提供方。

【发明内容】

[0006] 本发明的一个实施方式提供了一种用于实现持久化应用编程接口(API)的系统, 所述持久化API是平台独立的并且能够对业务逻辑进行向上调用。在操作期间,该系统在 API处接收在η层分布式应用的持久层处执行命令的请求。响应于所述请求,系统确定受该 命令影响的实体的实体类型。接着,系统标识与该实体类型和命令相关联的η层分布式应用 的中间层处的函数,其中该中间层包括业务逻辑。系统继而向中间层发送指令以执行所述 函数。最后,响应于在API处接收到有关函数已执行的确认,系统在持久层处执行所述命令。
[0007] 在本发明的某些实施方式中,当系统向中间层发送所述指令以执行函数时,系统 还向中间层发送所述命令,其中该命令的一部分用作该函数的参数。
[0008] 在本发明的某些实施方式中,系统在API处从中间层接收在持久层执行第二命令 的第二请求。
[0009] 在本发明的某些实施方式中,响应于第二请求,系统确定受该第二命令影响的第 二实体的第二实体类型。接着,系统标识与该第二实体类型和第二命令相关联的η层分布式 应用的中间层处的第二函数。系统继而向中间层发送第二指令以执行第二函数。最后,响应 于在API处接收到有关第二函数已执行的第二确认,系统在持久层处执行第二命令。
[0010] 在本发明的某些实施方式中,系统在API处创建包括指令和命令中的至少一个的 事务。接着,系统确定在中间层处是否成功执行函数以及在持久层处是否成功执行命令。如 果是,则系统提交(commit)事务。然而,如果否,则系统回退(rollback)事务。
[0011] 在本发明的某些实施方式中,系统通过在持久层创建持久层子事务来创建事务。 注意,提交事务包括提交持久层子事务,回退事务包括回退持久层子事务。
[0012] 在本发明的某些实施方式中,持久层包括关系型数据库。
[0013] 在本发明的某些实施方式中,在标识η层分布式应用的中间层处的函数之前,系统 在API处接收注册,该注册标识函数以及相关联的实体类型和命令。
[0014] 在本发明的某些实施方式中,标识中间层处的函数以及向中间层发送指令的步骤 由协调代理(Orchestration Delegate)来处理,其中当满足注册条件时,协调代理命令执 行先前向API注册的代码。
【附图说明】
[0015] 图1示出了根据本发明一个实施方式的计算环境;
[0016]图2示出了根据本发明一个实施方式的装置;以及
[0017] 图3提供了示出根据本发明一个实施方式、促进平台独立的并且能够对业务逻辑 进行向上调用的持久化应用编程接口(API)的过程的相关联流程图。
【具体实施方式】
[0018] 提供以下描述以使得本领域任何技术人员能够制造和使用本发明,其中在特定应 用及其需求的上下文中提供此描述。对所公开的实施方式的各种变形对于本领域技术人员 来说将是很明显的,并且此处所定义的通用原理可以应用到其他实施方式和应用,而不偏 离本发明的精神和范围。因此,其意图不在于将本发明限制在所示出的实施方式,而是按照 与此处所公开的原理和特征相一致的最宽广的范围。
[0019] 在此【具体实施方式】部分描述的数据结构和代码通常存储在计算机可读存储介质 上,计算机可读存储介质可以是能够存储代码和/或数据以供计算机系统使用的任何设备 或介质。计算机可读存储介质包括但不限于,易失性存储器、非易失性存储器、磁的和光学 存储设备,诸如磁盘驱动、磁带、CD(紧致盘)、DVD(数字多功能盘或数字视频盘),或者现在 已知的或者以后开发的能够存储计算机可读介质的其他介质。
[0020] 在此【具体实施方式】部分所描述的方法和过程可以具体化为代码和/或数据,其可 以存储在上述计算机可读存储介质中。当计算机系统读取并执行这些存储在计算机可读存 储介质中的代码或数据时,该计算机系统执行这些具体化为数据结构和代码并且存储在计 算机可读存储介质中的方法和过程。
[0021 ]此外,下文描述的方法和过程可以包括在硬件模块中。例如,硬件模块可以包括但 不限于,专用集成电路(ASIC)芯片、现场可编程门阵列(FPGA)、以及现在已知的和以后开发 的其他可编程逻辑器件。当激活硬件模块时,这些硬件模块执行包括于其中的方法和过程。
[0022] 挺塗
[0023]本发明的一个实施方式提供了一种用于实现持久化应用编程接口(API)的系统, 该持久化API是平台独立的并且能够对业务逻辑进行向上调用。在操作期间,该系统在API 处接收请求,以在η层分布式应用的持久层处执行命令。响应于该请求,系统确定受该命令 影响的实体的实体类型。接着,系统标识与该实体类型和命令相关联的η层分布式应用的中 间层处的函数,其中该中间层包括业务逻辑。系统继而向中间层发送指令以执行所述函数。 最后,响应于在API处接收到有关函数已执行的确认,系统在持久层处执行所述命令。
[0024]例如,对持久层的所有调用可以由持久化API来处理。持久化API支持基于web的应 用将数据保存到数据库,并且在如此操作时,执行检查有效性的业务逻辑、做簿记,等等。持 久化API使得有可能从持久层调用中间层逻辑,这实际上是从较低层到较高层的向上调用。 进行这些向上调用,而编写中间层代码的程序员无需具有关于持久层的实现的任何知识。 注意,持久层API使得中间层逻辑不必知晓持久层的细节。此外,持久层API使得基于web的 应用能够在数据库、对象关系(0R)映射器、语言(诸如Java?和C#?)以及平台(诸如 Windows?和U nix?)保留可移植性。
[0025] 在本发明的某些实施方式中,当系统向中间层发送指令以执行函数时,系统还向 中间层发送命令,其中该命令的一部分用作该函数的参数。
[0026] 在本发明的某些实施方式中,系统在API处从中间层接收在持久层执行第二命令 的第二请求。注意,尽管中间层正在执行与所述命令相关联的代码,但是中间层可以向持久 化API发送附加请求。而且,这些附加请求的每一个甚至可以转而引起更多的附加请求。
[0027] 在本发明的某些实施方式中,响应于第二请求,系统确定受该第二命令影响的第 二实体的第二实体类型。接着,系统标识与该第二实体类型和第二命令相关联的η层分布式 应用的中间层处的第二函数。系统继而向中间层发送第二指令以执行第二函数。最后,响应 于在API处接收到有关第二函数已执行的第二确认,系统在持久层处执行第二命令。
[0028]在本发明的某些实施方式中,系统在API处创建包括指令和命令中的至少一个的 事务。接着,系统确定在中间层处是否成功执行函数以及在持久层处是否成功执行命令。如 果是,则系统提交该事务。然而,如果否,则系统回退该事务。注意,事务是从持久化API创 建、提交和回退的。
[0029] 在本发明的某些实施方式中,系统通过在持久层创建持久层子事务来创建事务。 注意,提交事务包括提交持久层子事务,回退事务包括回退持久层子事务。在这些实施方式 中,持久化API利用数据库的已有事务框架。
[0030] 在本发明的某些实施方式中,持久层包括关系型数据库。注意,尽管本发明的多数 实施方式使用关系型数据库,但是通常可以使用任何类型的数据存储。在某些实施方式中, 这可以包括基于XML的文件管理系统。
[0031] 在本发明的某些实施方式中,在标识在η层分布式应用的中间层处的函数之前,系 统在API处接收注册,该注册标识函数以及相关联的实体类型和命令。注意,程序员仅需要 注册具有相关联的实体类型和命令特定函数,而无需知道有关持久层任何其他知识。
[0032] 例如,程序员可以注册这样的特定函数,当API接收到向客户表输入新记录的命令 时,其应用用于添加新客户的业务规则。
[0033]在本发明的某些实施方式中,标识中间层处的函数以及向中间层发送指令的步骤 由协调代理来处理,其中当满足注册条件时,协调代理命令执行先前向API注册的代码。 [0034] 注意,当命令在API处执行时,协调代理主动地将这些指令派送给中间层。备选地, 系统可以使用注册模型以代替协调代理,其中中间层处的函数被配置为监听API处的特定 事件。
[0035]在本发明的一种实施方式中,称为"存储库"的API是用于所有持久操作的公共 API。此API的实现:分析普通对象和实体的进入图形;确定哪些项目是新的,哪些项目是对 已有项目的更新;交换合成父母的合成孩子;施加约束;以及调用执行实际持久操作(创建、 读取、更新以及删除)的逻辑代理。逻辑代理还调用中间层逻辑,其实现为向系统注册的一 个或多个协调原子。中间层逻辑可以任意执行复杂操作,包括对存储库进行附加调用。存储 库也处理启动、提交和回退事务。
[0036] 计算环境
[0037] 图1示出了根据本发明一个实施方式的计算环境100。计算环境100包括多个计算 机系统,其通常可以包括基于微处理器、大型计算机、数字信号处理器、便携式计算设备、个 人记事本、设备控制器、或器件内的计算引擎的任意类型的计算机系统。更具体地,参考图 1,计算环境100包括客户端110-112、用户120和121、服务器130-150、网络160、数据库170、 设备180以及器件190。
[0038] 客户端110-112可以包括网络上的任何节点,其包括计算能力并且包括用于通过 网络进行通信的机制。此外,客户端110-112可以包括η层应用架构中的一层,其中客户端 110-112可以作为服务器(为来自较低层或用户的请求提供服务),并且客户端110-112可以 作为客户端(将请求转发给更高层)。
[0039] 类似地,服务器130-150通常可以包括网络上的任何节点,其包括用于为来自客户 端的对计算和/或数据存储资源的请求提供服务的机制。服务器130-150可以加入高等计算 集群,或者可以作为单机服务器。在本发明的一种实施方式中,服务器140是服务器150的在 线"热备件"。
[0040] 用户120和121可以包括:个人;个人群体;组织;组织群体;计算系统;计算系统群 体;或可以与计算环境1〇〇交互的任何其他实体。
[0041] 网络160可以包括能够将计算节点耦合到一起的任何类型的有线或无线通信信 道。这包括但不限于,局域网、广域网或网络的组合。在本发明的一种实施方式中,网络160 包括互联网。在本发明的某些实施方式中,网络160包括电话和蜂窝电话网络。
[0042] 数据库170可以包括用于在非易失性存储设备中存储数据的任何类型的系统。这 包括但不限于,基于磁的、光的或光磁存储设备的系统,以及基于闪存和/或电池供电存储 器的存储设备。注意,数据库170可以耦合至:服务器(诸如服务器150)、客户端、或直接耦合 至网络。
[0043] 设备180可以包括能够耦合至客户端(诸如客户端112)的任何类型的电子设备。这 包括但不限于,蜂窝电话、个人数字助理(PDA)、智能手机、个人音乐播放器(诸如MP3播放 器)、游戏系统、数字相机、便携式存储介质、或能够耦合至客户端的任何其他设备。注意,在 本发明的某些实施方式中,设备180可以直接耦合至网络160并且可以以与客户端110-112 相同的方式工作。
[0044] 器件190可以包括能够耦合至网络160的任何类型的器件。这包括但不限于,路由 器、交换机、负载平衡器、网络加速器、以及专用处理器。器件190可以用作服务器140和网络 160之间的网关、代理或转译器。
[0045] 注意,本发明的不同实施方式可以使用不同的系统配置,并且不限于计算环境100 中示出的系统配置。一般而言,能够经由网络160通信的任何设备可以包含本发明的元件。
[0046] 例如,在本发明的一个实施方式中,用户120使用客户端110来访问服务器140和 150上容纳的η层基于web的应用以及数据库170。在此实施方式中,服务器140用作表现层, 其处理与用户120和客户端110的所有交互。此外,服务器150包含业务层或中间层,并且包 括所有业务逻辑。最后,数据库170包含持久层,并且为基于web的应用提供数据存储。
[0047] 莖置
[0048]图2示出了装置200,图3提供了示出根据本发明一个实施方式、促进平台独立的并 且能够对业务逻辑进行向上调用的持久化应用编程接口(API)的过程的相关联流程图。
[0049] 装置200例如可以包含服务器150、数据库170、器件190、客户端110、设备180或其 任意组合,其包括接收机制202、确定机制204、标识机制206、发送机制208、执行机制210、处 理器214以及存储器216。
[0050] 在操作期间,接收机制202在API处接收请求,以在η层分布式应用的持久层处执行 命令(操作302)。接着,确定机制204响应于该请求,确定受该命令影响的实体的实体类型 (操作304)。例如,命令可以包括对雇员记录进行更新以调整该雇员的薪水。在此示例中,实 体类型可以是雇员表。
[0051] 继而,标识机制206标识与该实体类型和命令相关联的η层分布式应用的中间层处 的函数(操作306),其中该中间层包括业务逻辑。例如,此函数可以检查薪水在允许的范围 内并且发布命令的人员有足够的权利这么做。
[0052]此时,API可以可选地启动事务(操作307)。在本发明的某些实施方式中,如前面所 描述的,API可以利用作为数据库170的一部分的已有事务系统。
[0053]接着,发送机制208向中间层发送指令以执行所述函数(操作308)。响应于在API处 接收到有关函数已执行的确认,执行机制210在持久层处执行所述命令(操作310)。最后,如 果API之前启动了事务,并且如果所述函数和命令都已成功执行,则API提交此事务(操作 312)。
[0054] 示例性实施方式
[0055] 以下部分描述了仅用于示例性目的的本发明的一个实施方式。注意,其意图不在 于将本发明限于此实施方式中描述的细节。
[0056] 此实施方式提供了一种系统,其中对象的持久化由实体服务API来控制,实体服务 调用Hibernate以执行CRUD(仓键、读取、更新、删除)操作。
[0057] 注意,Hibernate通过使用其用于检测脏对象以及可到达即持久化(persistence-by-reachability) 的内 部机制 (其中 ,其 自动确定对整个对象 图形或一组对象图形 中的元 素进行CRUD需要完成哪些)来确定创建、更新和删除的内容。
[0058]存储库是用于可扩展数据访问层的公共API,并且是实体服务之上的抽象层,其不 会为了创建、更新或删除操作而直接调用实体服务。相反,存储库通过调用创建、更新和删 除CRUD协调来执行创建、更新和删除。
[0059] 注意,CRUD协调是ICrudDelegate接口的实现,在存储库项目中定义了 ICrudDelegate接口。
[0060] CRUD协调代理接口非常简单,其类似于:
[0062]在系统启动期间,CRUD协调代理实现由协调初始化代码代理到存储库中。当调用 存储库操作时,存储库检查以查看存储库中是否有CRUD协调代理。如果没有CRUD协调代理, 则存储库执行CRUD操作而不执行协调。然而,如果有CRUD协调代理,则存储库与CRUD协调代 理一起工作以正确执行确认有效性逻辑、其他业务逻辑以及CRUD操作。
[0063]对于合成关系,系统可以令Hibernate来持久化对象图形。系统可以这么做是因为 系统仅定义了用于合成父母的CRUD协调。
[0064]对于数据对象的关联,以及对于数据类型的哈希映射,系统令Hibernate持久化图 形。系统可以这么做是因为CRUD协调从来没有被定义用于数据对象或数据类型。然而,对于 实体之间的关联,系统定义了用于关联的两端的CRUD协调,并且运行这两个CRUD协调。注 意,这要求协调由Hibernate执行的CRUD协调运行和操作以便联结关联的持久化。
[0065]以下讨论描述了存储库如何管理CRUD协调的运行以及用于所呈现的实体的对象 图形闭包的Hibernate持久化以保存和删除API的细节。
[0066] 需求和用例
[0067]首先,系统可以理想地提供API,此API具有直观行为、易于使用并且产生正确结 果。这是顶级要求。此部分中列出的其他一切旨在于为存储库API的客户端满足此要求。例 如,API的客户端可以进行以下操作:
[0068] 1.创建新的顾客实体,包括保存指向新顾客实体的发票(新的或以前保存的)。
[0069] 2.更新以前保存的顾客实体,包括改变存储器中以前保存的顾客实体、从发票关 联到该顾客实体以及保存此发票。
[0070] 3.更新以前保存的、已经与发票相关联的顾客实体,包括改变存储器中的顾客实 体以及保存该发票。
[0071] 系统也可以运行一个事务下的整套操作。存储库需要在调用存储库操作(例如,保 存)的开始时启动事务,并且在该调用结束时提交此事务。如果在操作期间任何点处发生错 误,存储库需要回退整个事务。
[0072] 系统也可以在将阵列递交给CRUD协调代理之前,移除重复的实体。在实体和数据 对象的重要图形中,有可能(事实上,很可能)同一实体可由不止一条通过图形的路径到达。 例如,两个不同的发票实体可以指向同一顾客实体。
[0073]为了避免对协调逻辑的过多调用,存储库可以在将阵列递交给CRUD协调代理之 前,将所有复制品从所有阵列中移除,从而使每个不同实体被协调引擎确切地只看到一次。 [0074]系统可以被配置为仅递交新实体以创建协调。递交给CRUD协调代理创建方法的阵 列应当仅包含新实体(以前从未被保存到数据库的实体)。
[0075]系统应当仅递交之前保存的、目前是脏的实体以便更新协调。
[0076]注意,递交给CRUD协调代理更新方法的阵列应当仅包含以前已经保存到数据库并 且现在脏了的实体。如果实体的任何简单属性已经改变,或者如果其任何1:1关系已经从非 空改变为空(假设它们可以为空)或者从空改变为非空,或者如果其任何汇集关系已经添加 或删除了元素,则此实体是脏的。
[0077]例如,如果源实体与目标实体之间的单向关联不再存在,则存储库可以将源实体 递交给CRUD协调代理以进行更新。类似地,如果两个实体之间的双向关联不再存在,则存储 库可以将两个实体都递交给CRUD协调代理以进行更新。注意,这暗示着关系(1:1和1比多) 应当跟踪添加的和删除的元素。
[0078]系统应当仅递交以前保存的实体以删除协调。而且,递交给CRUD协调代理删除方 法的阵列应当仅包含以前已经保存到数据库的实体。实体可以基于以下两个原因之一而被 删除:
[0079] 1 .API客户端明确调用对该实体的存储库删除。
[0080] 2.实体是从合成关系(1:1或1比多)移除的合成孩子,并且保存了合成父母,这需 要触发对所移除的实体的删除。
[0081]系统可以运行沿着用于实体的继承路径定义的CRUD协调。例如,实体类可以是其 他实体类的子类,直到建模器指定的任何深度。当对其继承路径中具有父类的实体执行 CRUD时,可以在此实体上运行针对此父类定义的CRUD协调。换言之,协调可以多形态地运 行。
[0082]注意,存储库不能实现此要求,因为其没有要递交到CRUD协调代理中的父实体实 例。相反,通过沿着继承路径走以及运行为路径中每个实体类定义的协调,此要求可以完全 实现在协调CRUD协调代理内。
[0083]系统还可以防止删除新实体。当对新实体调用存储库删除时,其可能抛出异常。 (注意,这已经由实体服务处理了。)
[0084]系统可以递交扩展实体,来代替对CRUD协调代理的扩展。当对扩展执行CRUD操作 时,存储库可以用其扩展实体来替换扩展,以及将扩展实体递交给CRUD协调代理,而不是给 它原始扩展。此要求存在两个原因:
[0085] 1.扩展可以是特定实体的η个扩展之一。为了CRUD协调能够正确地运行,这些CRUD 协调应当不仅仅在扩展上运行,而是还在扩展实体上运行,并且在扩展实体的所有其他扩 展上运行。通过翻转对其在调用CRUD协调代理之前扩展的实体的扩展,所有协调都正确地 运行。注意,这要求协调扩展适当地工作。
[0086] 2.在合成中,与扩展实体相关联的协调可以被撤消,不过这不会正确地工作,除非 扩展实体(而不是扩展)传递到CRUD协调代理中。
[0087] 系统也应当仅将合成父实体递交给CRUD协调代理。当对新的或脏的合成子实体调 用存储库保存或删除时,存储库应当用父实体替换子实体,并且将父实体递交给CRUD协调 代理,而不是给它子实体。如果父实体是新的,则存储库可以将父实体递交给CRUD协调代理 以进行创建。如果父实体不是新的,则存储库可以将父实体递交给CRUD协调代理以进行更 新。
[0088] 如果拥有子实体的实体本身在合成关系中是孩子,那么存储库可以将此父母的父 母给予CRUD协调代理,而不是将父母给予它,依此类推,直到合成关系的传递闭包向上到尽 头为止。应当仅将合成链的最终父母给CRUD协调代理以进行更新或创建。
[0089]例如,如果A拥有B,B拥有C,则应当仅有为A定义的协调,并且此协调需要处理B和C 二者所需的任何业务逻辑。
[0090] 注意,此要求包含了之前有关扩展的要求,因为扩展被映射为双向1:1合成,其中 扩展作为孩子。然而,由于协调应当在扩展实体的所有扩展上运行的子要求,因此明确调出 扩展用例非常重要。
[0091] 遵从根实体的持久化而运行CRUD协调
[0092] 此部分概述用于运行CRUD协调以作为存储库持久化操作的一部分的修订方法。用 于驱动实体对象的自动CRUD协调的初始设计路径,提供给存储库保存和删除操作,涉及从 所提供对象的图形闭包中收集所有候选实体对象以及在同类实体类型的批量中将它们递 送给CRUD协调代理,其中实体服务持久化操作和CRUD协调二者都将执行。
[0093] 紧密耦合的实体持久化和CRUD协调对于递送到存储库保存和删除方法的每个实 体对象都能很好地工作。然而,当尝试为作为在保存或删除操作中递送到存储库的实体的 对象图形闭包的一部分而间接持久化的实体执行CRUD协调时,产生了疑问。目的为隐含持 久化的实体可以很容易地从输入实体的对象图形闭包中标识出来。问题是如何将这种实体 递送给CRUD协调代理,其中要执行CRUD协调和持久化二者而不引起持久层中的冲突。例如, 如果已经持久化为保存输入实体的一部分,那么保存在递送给存储库.保存(T)的对象图形 闭包中发现的新实体将产生异常。
[0094]代替于引入对持久化配置的约束或者施加对允许的自动CRUD协调的扩展的限制, 可选设计最大化了针对所有受存储库保存和删除操作影响的实体的自动CRUD协调的运行。 此思想是通过两步骤处理实体,其中在任何给定时刻仅有单个实体被递送到CRUD协调代 理。首先,系统针对提供给存储库操作的每个实体执行持久化和CRUD协调。实际上,递送给 CRUD协调代理的实体事实上可以是合成根父母(如果所提供的实体是合成孩子的话),或者 是所提供实体扩展的扩展实体。在此步骤中,转送给CRUD协调代理的实体可以称为"根实 体"。注意,根实体已被持久化,并且执行注册的CRUD协调。
[0095]在这点上,用于被间接持久化的实体的CRUD协调尚未执行并且有待处理。记住,它 们被持久化为根实体持久化的一部分。第二步骤包括将这些实体的每一个发送给CRUD协调 代理。在这么做时,实体解除CRUD协调,并且被第二次递送给持久化管理器。在已有实体已 经更新过并且正在等待再次更新的情况下,Hibernate会在同一事务内将更新请求合并成 一个。基本上,第二保存变为空操作。持久化冲突可能仍然会产生,诸如在新实体被较早地 间接持久化为根实体保存操作的一部分的情况中。辨认与已经持久化的实体的持久化的各 种类型的冲突以及围绕其进行编码支持自动CRUD协调的更大覆盖。
[0096] 根实体的对象图形闭包中的新实体(其在保存根实体时就已经持久化)不应当在 同一事务中再次呈现给持久层。在CRUD协调代理内,可以检查实体isNewO的值。如果该值 为真并且实体也具有ID值(其指示在较早的保存中创建了实例),则其已经运行了 CRUD协调 并且不再被持久化。
[0097] 在提供实体的输入阵列的存储库保存和删除操作中,对于复制实例而言,也有可 能显式地出现在阵列元素中,或者隐式地出现在阵列中的实体的对象图形闭包中。除非被 处理,否则复制实例可以得到针对同一实体的CRUD协调的多个运行。存储库标识复制实体, 并且在遇到异常时抛出异常,以帮助调用方供应实体(无需复制品)给存储库。
[0098] 删除根实体的对象图形闭包中的相关联实体可能破坏关系的语义。例如,删除发 票不应当导致移除与其相关联的顾客。存储库将只删除根实体,因此仅在其上允许CRUD(也 即,删除)协调。这意味着,根实体的对象图形闭包中移除或更新的实体跟随根实体的删除, 其不会使CRUD协调运行。
[0099] 针对合成孩子调用删除操作将会抛出异常。存储库可以跳过孩子到其根父母,并 且对其调用删除,导致删除父母及其所有孩子。这不应该是调用方的本意。如果删除应当孩 子,则应该通过移除指定孩子来修改父母并继而保存。
[0100] 发送到存储库保持操作的新的合成孩子应当仅是父实体的新孩子。当在相同父母 下创建不止一个新子实体时,不可能确定合适的子实体。如果这种情况出现的话,则抛出 InvalidOperationException(无效操作异常)。
[0101]
[0102] 可以实现访客以标识递送到存储库保存和删除方法的实体的对象图形闭包中新 的或更新的实体。访客实现IEntity访客。对于保存和删除两种情况,访客可以:
[0103] 1.提供在保存和删除模式之间切换的方式。
[0104] 2.遍历递送到保存(实体)/删除(实体)方法中的整个对象图形、以及递送到保存 (实体[])/删除(实体[])方法中的整个对象图形的整个阵列,同时执行循环检测以避免访 问任何节点超过一次(已经是Ent i tyCommon中访客实现的一部分)。
[0105] 3.分析对象图形中的节点以标识和收集应当递送到CRUD协调代理的实体。
[0106] 对于保存,访客将:
[0107] 1.除去作为扩展的实体之外,在未设置唯一 ID的每个实体中设置唯一 ID。
[0108] 2.将新实体置入特定于每个实体确切类型的创建阵列中。
[0109] 3.将之前保存的、现在脏了的实体置入特定于每个实体确切类型的更新阵列中。 [011 0] 4.确定每个实体在整个阵列集合中只出现一次。
[0111] 5.利用扩展所扩展的内容来替换扩展。
[0112] 6.利用合成子实体的父实体来传递性地替换这些合成子实体,直到到达最终父 母。
[0113] 7.使得所收集的阵列实体对于存储库可用。
[0114] 对于删除,访客可以确定对象图形闭包中的实体是否是新的,以支持存储库抛出 异常。注意,实体服务已经实现了这个,不过如果系统可以较早抓住错误,那么将整个图形 发送给服务器就太浪费了。
[0115] 存储库行为
[0116] 当调用存储库保存时,存储库可以:
[0117] 1.启动事务。
[0118] 2.创建访客并将其置入保存模式。
[0119] 3.在一个或多个输入实体或实体上运行该访客。
[0120] 4.翻转标识为对扩展实体的可扩展的根实体。
[0121 ] 5.翻转标识为根合成父母的合成孩子的根实体。
[0122] 6.将根实体递交给CRUD协调代理更新或创建方法。
[0123] 7.将访客所标识的每个实体递交给CRUD协调代理更新或创建方法。
[0124] 8.提交事务以完成实体对数据库的持久化。
[0125] 9.将保存的实体/多个实体返回给调用方。
[0126] 当调用存储库删除时,存储库可以:
[0127] 1.启动事务。
[0128] 2.创建访客并将其置入删除模式。
[0129] 3.如果在对象图形闭包中发现新实体,则在根实体上运行访客以抛出异常。
[0130] 4.对于删除(实体[]),如果在对象图形闭包中发现复制实体,则抛出异常。
[0131 ] 5.将根实体递交给CRUD协调代理删除方法。
[0132] 6.提交事务。
[0133] 异室
[0134] 在处理用于保存和删除操作的输入实体中,存储库标识多个新的错误情形。在每 种情况中,抛出InvalidOperationException(无效操作异常)。异常被存储库抓住以便回退 针对保存或删除操作初始发起的事务。注意,异常详述了 :
[0135] 1.新实体被提供给删除操作。
[0136] 2.在提供给保存操作的实体的对象图形闭包中发现了没有合成父实例的合成孩 子。
[0137] 3.合成孩子被提供给删除操作。假定存储库总是翻跳到父母,则删除父母不太适 合。
[0138] 4.在提供给保存操作的一个或多个实体的对象图形闭包中发现同一实体实例多 次出现。
[0139 ] 5.在提供给保存操作的实体的对象图形闭包中发现未解决的实体。
[0140] 6.不能返回对应于提供给保存操作的实体的已保存对象。
[0141]仅出于示例性和描述性的目的提供了本发明的实施方式的前述描述。其意图不在 于穷尽或将本发明限制于所公开的形式。相应地,对于本领域的技术实践者而言,多种修改 和变形是很明显的。此外,上述公开不在于限制本发明。本发明的范围由所附权利要求来定 义。
【主权项】
1. 一种用于实现持久化应用编程接口(API)的方法,所述持久化API是平台独立的并且 能够对业务逻辑进行向上调用,所述方法包括: 在所述API处接收在η层分布式应用的持久层处执行命令的请求; 响应于所述请求,确定受所述命令影响的实体的实体类型; 标识与所述实体类型和所述命令相关联的、所述η层分布式应用的中间层处的函数,其 中所述中间层包括所述业务逻辑; 从所述持久层处的所述API向所述中间层发送指令以执行所述函数;以及 响应于在所述API处接收到有关所述函数已执行的确认,在所述持久层处执行所述命 令, 其中所述持久层被包括在为基于web的应用提供数据存储的数据库中,并且所述API能 够利用作为所述数据库的一部分的已有事务系统。2. 根据权利要求1所述的方法,其中向所述中间层发送所述指令还包括向所述中间层 发送所述命令,其中所述命令的一部分用作所述函数的参数。3. 根据权利要求1所述的方法,还包括在所述API处从所述中间层接收在所述持久层执 行第二命令的第二请求。4. 根据权利要求3所述的方法,还包括: 响应于所述第二请求,确定受所述第二命令影响的第二实体的第二实体类型; 标识与第二实体类型和第二命令相关联的、所述η层分布式应用的所述中间层处的第 二函数; 向中间层发送第二指令以执行第二函数;以及 响应于在API处接收到有关第二函数已执行的第二确认,在持久层执行第二命令。5. 根据权利要求1所述的方法,还包括: 在所述API处创建包括所述指令和所述命令中的至少一个的事务; 确定在中间层处是否成功执行所述函数以及在持久层处是否成功执行所述命令; 如果是,则提交所述事务;以及 如果否,则回退所述事务。6. 根据权利要求5所述的方法,其中创建所述事务包括在持久层处创建持久层子事务, 其中提交所述事务包括提交所述持久层子事务,并且回退所述事务包括回退所述持久层子 事务。7. 根据权利要求1所述的方法,其中所述持久层包括关系型数据库。8. 根据权利要求1所述的方法,其中在标识在所述η层分布式应用的中间层处的所述函 数之前,所述方法还包括:在API处接收注册,所述注册标识所述函数以及相关联的实体类 型和命令。9. 根据权利要求1所述的方法,其中标识中间层处的所述函数以及向中间层发送所述 指令的步骤由协调代理来处理,其中当满足注册条件时,所述协调代理命令先前向API注册 的代码执行。10. -种用于实现持久化应用编程接口(API)的设备,所述持久化API是平台独立的并 且能够对业务逻辑进行向上调用,包括: 用于在所述API处接收在η层分布式应用的持久层处执行命令的请求的装置; 用于响应于所述请求,确定受所述命令影响的实体的实体类型的装置; 用于标识与所述实体类型和所述命令相关联的、所述η层分布式应用的中间层处的函 数的装置,其中所述中间层包括所述业务逻辑; 用于从所述持久层处的所述API向所述中间层发送指令以执行所述函数的装置;以及 用于响应于在所述API处接收到有关所述函数已执行的确认,在所述持久层处执行所 述命令的装置, 其中所述持久层被包括在为基于web的应用提供数据存储的数据库中,并且所述API能 够利用作为所述数据库的一部分的已有事务系统。11. 根据权利要求10所述的设备,其中用于向所述中间层发送所述指令的装置还包括 用于向所述中间层发送所述命令的装置,其中所述命令的一部分用作所述函数的参数。12. 根据权利要求10所述的设备,其中所述设备还包括用于在所述API处从所述中间层 接收在所述持久层执行第二命令的第二请求的装置。13. 根据权利要求12所述的设备,还包括: 用于响应于所述第二请求,确定受所述第二命令影响的第二实体的第二实体类型的装 置; 用于标识与第二实体类型和第二命令相关联的、所述η层分布式应用的所述中间层处 的第二函数的装置; 用于向中间层发送第二指令以执行第二函数的装置;以及 用于响应于在API处接收到有关第二函数已执行的第二确认,在持久层执行第二命令 的装置。14. 根据权利要求10所述的设备,还包括: 用于在所述API处创建包括所述指令和所述命令中的至少一个的事务的装置; 用于确定在中间层处是否成功执行所述函数以及在持久层处是否成功执行所述命令 的装置; 用于如果是,则提交所述事务的装置;以及 用于如果否,则回退所述事务的装置。15. 根据权利要求14所述的设备,其中用于创建所述事务的装置包括在持久层处创建 持久层子事务,其中提交所述事务包括提交所述持久层子事务,并且回退所述事务包括回 退所述持久层子事务。16. 根据权利要求10所述的设备,其中所述持久层包括关系型数据库。17. 根据权利要求10所述的设备,其中在标识在所述η层分布式应用的中间层处的所述 函数之前,所述设备还包括:用于在API处接收注册的装置,所述注册标识所述函数以及相 关联的实体类型和命令。18. 根据权利要求10所述的设备,其中用于标识中间层处的所述函数的装置以及用于 向中间层发送所述指令的装置由协调代理来处理,其中当满足注册条件时,所述协调代理 命令先前向API注册的代码执行。
【文档编号】G06F9/54GK106095600SQ201610405574
【公开日】2016年11月9日
【申请日】2009年10月9日
【发明人】J·科林斯, C·默里, R·A·卢本, J·肖沃尔特, R·J·查普曼
【申请人】因特伟特公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1