CN108984541A - 一种基于对象数据模型的对象关系映射方法及装置 - Google Patents
一种基于对象数据模型的对象关系映射方法及装置 Download PDFInfo
- Publication number
- CN108984541A CN108984541A CN201710395918.4A CN201710395918A CN108984541A CN 108984541 A CN108984541 A CN 108984541A CN 201710395918 A CN201710395918 A CN 201710395918A CN 108984541 A CN108984541 A CN 108984541A
- Authority
- CN
- China
- Prior art keywords
- association
- type
- attribute
- value
- model
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明属于计算机技术领域,公开了一种基于对象数据模型的对象关系映射方法及装置,以描述对象系统及其与关系系统映射规则的元数据体系为基础,其特征在于,具体方法步骤如下:构建对象系统形式模型,并命名为对象数据模型;将对象保存到关系存储系统;从关系存储系统查询对象;创建关联端对象;加载关联引用对象。本发明方法通过构建对象数据模型并以此为基础进行对象关系映射,可以扩展ORM程序的通用性、支持多方复杂关联。
Description
技术领域
本发明属于计算机技术领域,具体为一种基于对象数据模型的对象关系映射方法及装置。
背景技术
面向对象软件开发思想将软件系统看作对象及对象之间的关系(即对象系统),系统的运行体现为对象之间的相互作用,而将系统数据的存储看作对对象当前状态实施的持久化操作。在当前软件工程中,经常需要将数据存储到关系数据库中,以便进行应用访问,而且几乎所有的存储系统都采用关系型数据结构。由于对象系统的结构与关系数据结构往往存在显著差异且该难题一直未被有效解决。故自面向对象开发普及以来,如何将对象“挤”入关系存储系统(通常称为ORM,即对象关系映射)成为一个难题。
关系型数据与对象数据的转换,通常称为对象关系映射(ObjectRelationalMapping,ORM),其是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。为了实现对象关系的映射,现有技术中,采用了两种方式。其中一种,是在面向对象的程序代码中,直接嵌入数据库语句,从而以硬编码的方式,实现数据库返回的结果与对象数据的映射;第二种方式,借助第三方框架,预先建立对象与关系数据间完整的映射关系,根据所述映射关系实现映射。
但是,发明人在本申请的研究过程中发现,采用现有技术进行ORM映射时,还存在一定的问题:
(1)不支持多方关联,只支持二方关联,(参见不支持复杂关联(即拥有属性的关联);
(2)不能描述关联对象(对象系统中的一种特殊对象,不同于实体对象);
(3)取值和设值只能通过属性访问器,而对于复杂对象来说,其某些属性或关联指针可能不宜对外开放;
(4)取值和设值机制不具可扩展性,不支持业务系统插入特殊映射逻辑;
(5)关联的映射(即对象间关系的映射)依赖外键属性,而有些对象可能不具有外键属性。
这些问题限制了ORM程序的应用范围,通常只能应用于简单对象系统,因此,本发明有针对性地设计出一种基于对象数据模型的对象关系映射方法及装置,以扩展ORM程序的通用性。
发明内容
本发明目的是为了克服现有技术中的不足,故一种基于对象数据模型的对象关系映射方法及装置,以解决目前ORM方法所面临的技术缺点。
为了解决上述技术问题,本发明是通过以下技术方案实现:
1.一种基于对象数据模型的对象关系映射方法,其具体方法步骤如下:
构建对象系统形式模型,并命名为对象数据模型;
将对象保存到关系存储系统;
从关系存储系统查询对象;
创建关联端对象;
加载关联引用对象。
进一步地,所述对象数据模型构建的具体步骤如下:
使用一组具有特定含义的数据项描述对象系统中的实体对象及其内部的属性和关联指针,说明实体对象与关系映射的规则;
描述对象系统中的链及其各端,说明链与关系映射的规则;
依据链在对象系统中是否有相应的关联对象,将链分为显式关联和隐式关联两种,对有关联对象的链进一步对其属性进行描述;
依据链和其端对象是否与同一关系映射,将链的映射分成伴随映射和独立映射两种,并对两种映射执行不同的映射逻辑;
定义构造器规范,只要符合此规范的程序块均可被所述模型识别,供ORM程序调用以创建对象;
定义取值器规范,只要符合此规范的程序块均可被所述模型识别,供ORM程序调用以获取对象属性值、关联引用对象或关联端对象;
定义设值器规范,只要符合此规范的程序块均可被所述模型识别,供ORM程序调用以设置对象属性值、关联引用对象或关联端对象。
进一步地,所述的将对象保存到关系存储系统子方法,其具体步骤如下:
接受业务系统建立的特定于该业务系统的对象系统的对象数据模型;
根据要保存对象的类型从所述模型中查找对应的实体型或关联型(下称目标型);
如果目标型为实体型,选出关联型为伴随关联且左端为伴随端的关联引用,使用其取值器取出关联引用对象,将这些对象存入容器A,(特别地,如果上述关联为隐式关联,则首先创建隐式关联对象,将此隐式关联对象放入容器A);
生成对象保存SQL;
使用各属性的取值器从对象获取属性值,分别作为相应SQL语句参数的取值,(特别地,如果要获取其值的属性位于关联端对象,首先使用该关联端的取值器获取该关联端对象,然后再从该关联端对象中获取属性值);
执行所述SQL语句。
进一步地,所述的从关系存储系统查询对象子方法,其具体步骤如下:
接受业务系统建立的特定于该业务系统的对象系统的对象数据模型;
确定目标型,即根据要查询的对象的类型名从所述模型中查找对应的实体型或关联型;
接受用户输入的查询条件;
生成对象查询SQL;
执行所述SQL语句,得到查询结果集;
遍历所述查询结果集各行,每一行创建一个对象,如果所建对象为关联对象,为其每一个关联端创建关联端对象,如果所建对象为实体对象,为其每一个关联引用加载关联引用对象。
进一步地,所述的创建关联端对象,其具体步骤如下:
接收调用方传入的查询结果集和要为其创建对象的关联端(目标关联端);
使用目标关联端的实体型的构造器创建对象;
遍历上述实体型的各属性,对每一属性使用其设值器为相应的对象属性设值,该值来源于所述查询结果集当前行;
遍历上述实体型的各关联引用,对每一关联引用加载关联引用对象;
使用目标关联端的设值器,将所建对象设置为该关联端的值。
进一步地,所述的加载关联引用对象,其具体步骤如下:
确定要从关系存储系统查询的目标型(实体型或关联型);
生成关联引用加载SQL;
使用相应属性的取值器获取上述SQL语句各参数的值;
执行权利要求4所述的从关系存储系统查询对象子方法的最后两步;
使用所述关联引用的设值器,将上一步创建的对象设置为关联引用的值。
2 一种通用对象关系映射装置,包含:
映射执行单元,执行具体的映射逻辑,同时向使用者公开本装置的使用接口;
SQL生成单元,生成供映射执行单元使用的对象保存SQL语句、对象查询SQL语句和引用加载SQL语句;
模型管理单元,管理装置使用者建立的特定于具体对象系统的对象数据模型,并提供模型元数据项的查询接口。
进一步地,所述的模型管理单元,将用于描述对象系统及其与关系系统映射规则的元数据项分类存储;提供一组接口供装置其它部分查询所述元数据项。
进一步地,所述的SQL生成单元,生成的SQL可通过如权利要求8所述的接口,从所述模型管理单元查询需要的元数据项。
进一步地,所述的映射执行单元,使用如权利要求3所述的方法将对象保存到关系存储系统,使用如权利要求4所述的方法从关系存储系统查询对象;通过如权利要求8所述的接口,从所述模型管理单元查询需要的元数据项;请求所述SQL生成单元生成对象保存SQL和对象查询SQL;向使用者公开对象保存接口和对象查询接口作为本装置的使用接口。
本发明的优点和有益效果是:本发明方法通过构建对象数据模型并以此为基础进行对象关系映射,可以扩展ORM程序的通用性、支持多方复杂关联;允许业务系统自定义取值和设置方式;在无外键属性的情况下也可以实现关联的映射。
附图说明
图1是本发明方法中对象数据模型结构示意图;
图2是本发明应用于一个在线商品展示平台的对象系统结构示意图;
图3是本发明实施例提供的一种对象关系映射装置。
具体实施方式
以下结合本发明结构附图和实施例对本发明产品作进一步描述,实施例的描述仅为便于理解和应用本发明,而非对本发明保护的限制。
原理介绍:计算机无法从语义层面理解对象系统,因此必须对对象系统做形式化描述,以便计算机能够根据这种描述正确地“理解”对象系统,这种形式化描述称为对象系统的形式模型。形式模型是ORM程序访问对象系统的“地图”,它依照地图在对象系统中搜寻数据、向对象系统写入数据,并按地图指定的路径与关系系统进行数据交互。因此,对象系统形式模型是ORM程序的基础与灵魂。如EF使用的模型称为Entity Data Model(实体数据模型,简称EDM)。实体数据模型(EDM)是一组描述数据结构(而不管其存储形式如何)的概念。EDM借自于Peter Chen于1976年所描述的实体关系模型,但它是在实体关系模型基础上构建的并扩展了其传统用途。EDM解决了以多种形式存储的数据所带来的难题。例如,假设某项业务将数据存储在关系数据库、文本文件、XML文件、电子表格和报表中。这在数据建模、应用程序设计和数据访问方面会带来很大的难题。当设计面向对象的应用程序时,其困难在于如何编写高效的、可维护的代码而不必牺牲数据访问、存储和可扩展性方面的高效性。当数据具有关系结构时,其在数据访问、存储和可扩展性方面会非常高效,但编写高效的、可维护的代码则变得非常困难。当数据具有对象结构时,上述关系恰好相反:编写高效的、可维护的代码要以牺牲数据访问、存储和可扩展性方面的高效性为代价。即使可以在这些优劣方面找到最佳平衡,但是当将数据从一种形式转变为另一种形式时又会引发新的难题。实体数据模型通过以独立于任何存储架构的实体和关系的方式描述数据结构解决了这些难题。这使得数据的存储形式与应用程序设计和开发变得不相关。此外,由于实体和关系描述的是数据在应用程序中使用时的结构(而不是其存储形式),因此它们会随应用程序的演变而演变。conceptua/mode/是实体和关系的数据结构的特定表示形式,通常用实现EDM概念的域特定语言(DSL)定义。概念架构定义语言(CSDL)就是这种域特定语言的一个示例。可以将概念模型中描述的实体和关系视为对应用程序中的对象和关联的一种抽象表述。这使得开发人员可以专注于概念模型而不必考虑存储架构,从而在编写代码时更多关注高效性和可维护性。与此同时,存储架构设计者可以专注于数据访问、存储和可扩展性方面的高效性。该模型一方面对对象系统中的对象及对象间关系进行抽象描述,另一方面定义了其自身与关系模型的映射规则。在将对象转换为关系元组时(持久化操作),EF依照EDM的指引从对象系统内部获取对象状态数据,然后根据映射规则生成关系元组;在将关系元组转换为对象时(反持久化操作),EF根据映射规则从关系元组中读取数据,然后根据EDM的指引将数据注入到对象系统(设值)。
实施例1
如附图1所示,本发明首先设计了一种全新的对象系统形式化模型,称为对象数据模型(Object Data Model,简称ODM),其基本构造块为实体型和关联型。实体型描述对象系统中的实体对象,包含至少一个属性,用于描述对象的属性。实体型与关系映射,其所描述的对象映射为该关系的元组;实体型的属性与该关系的属性映射,其所描述的属性的值映射为该元组的元素。关联型(也称为关联)描述对象系统中的链(即对象间的关系),包含至少两个关联端,用于描述链的各端。如果对象系统中存在一个代表该链的关联对象,那么该关联为显式关联,否则为隐式关联。显式关联通常包含属性,用于描述关联对象的属性。关联型与关系映射,其所描述的链映射为该关系的元组;关联端与该关系的主属性映射,关联端对象的标识属性的值映射为主属性的值;关联型的属性与该关系的属性映射,其所描述的属性的值映射为该元组的元素。
实体型还可以包含若干个关联引用,用于描述对象内部的关联指针,该指针指向链另一端的对象或者代表该链的关联对象。
(1)实体型
实体型是对象数据模型的基本构造块,用于描述对象系统中的实体对象,一个对象类型(Class)对应一个实体型。实体型与关系映射,其所描述的对象映射为该关系的元组。实体型的元数据结构如下:
●命名空间;
●名称,实体型的标识,在命名空间范围内唯一;
●标识属性,指定能够唯一标识一个对象的一个或一组属性,一个实体型有且仅有一个或一组标识属性;
●标识是否自增,指示标识属性是否自增;
●构造器,用于创建实体对象的程序块,必须符合《对象构造器规范》;
●映射名,与实体型映射的关系的名称。
此外,实体型包含至少一个属性,可以包含若干个关联引用。
(2)关联型
关联型简称关联,也是对象数据模型的基本构造块,用于描述对象系统中的链(即对象间的关系),一个关联型对应一种类型的链。与实体型一样,关联型也与关系映射,其所描述的链映射为该关系的元组。
如果对象系统中存在一个代表该链的关联对象,那么该关联为显式关联,否则为隐式关联。
关联型的元数据结构如下:
●命名空间;
●名称,关联型的标识,在命名空间范围内唯一;
●构造器,用于构造关联对象的程序块,必须符合《对象构造器规范》;
●是否为显式关联,指示关联是否为显式关联;
●映射名,与关联映射的关系的名称。
关联型包含至少两个关联端。显式关联可以包含属性(称为“关联属性”),如果包含则称其为复杂关联,否则为简单关联。
如果与关联映射的关系与其某一关联端的实体型的映射关系相同,该关联称为伴随关联,这种映射称为伴随映射,该关联端称为伴随关联端(简称伴随端);否则该关联称为独立关联,这种映射称为独立映射。
(3)属性
属性用于描述对象(实体对象或关联对象)的属性,一个属性对应一个对象属性。属性与关系的属性映射,其所描述的属性的值映射为关系元组的元素。属性的元数据结构如下:
●名称,属性的标识,在实体型或关联型内唯一;
●数据类型,属性值的数据类型,如整型、字符串型等;
●取值器,用于从对象获取属性值的程序块,必须符合《取值器规范》;
●设值器,用于为对象的属性设值的程序块,必须符合《设值器规范》;
●映射名,与该属性映射的关系属性的名称。
属性分为简单属性和复杂属性。简单属性是指其值为基元类型的属性。复杂属性是指其值为复杂类型的属性。
(4)基元类型
对象数据模型支持9种基元类型:字节型、整型、长整型、布尔型、浮点型(单精度)、浮点型(双精度)、字符型、字符串型、日期时间型。
(5)复杂类型
复杂类型用于描述建构对象系统的复杂数据类型(如struct),由至少2个属性组合而成,其中属性既可以是简单属性也可以是复杂属性(该复杂属性的类型不能为该复杂类型自身)。
复杂类型的元数据结构如下:
●命名空间;
●名称,复杂类型的标识,在命名空间范围内唯一;
●构造器,用于构造复杂类型实例的程序块,必须符合《对象构造器规范》。
(6)关联引用
关联引用用于描述对象内部的关联指针,该指针指向链另一端的对象或者代表该链的关联对象,通常对象所参与的每一个链都对应有一个关联指针。关联引用的元数据结构如下:
●名称,关联引用的标识,在关联型内部唯一;
●关联型,即描述链的关联型;
●左端名,关联指针所属的对象对应的关联端的名称;
●右端名,关联指针指向的对象对应的关联端的名称;
●取值器,用于从对象中获取关联引用对象(即关联指针的值)的程序块,必须符合《取值器规范》;
●设值器,用于设置关联引用对象的程序块,必须符合《设值器规范》。
(7)关联端
关联端用于描述链的端。其元数据结构如下:
●名称,关联端的标识,在关联型内部唯一;
●实体型,即描述链端对象的实体型;
●关联重数,链端对象的数量约束,可以为一个、多个、一个或多个;
●取值器,用于从关联对象获取关联端对象(即位于链的某一端的对象)的程序块,必须符合《取值器规范》;
●设值器,为关联对象设置关联端对象的程序块,必须符合《设值器规范》;
●映射规则,指定关联端对象的标识属性与关系属性的映射,一个标识属性与一个关系属性映射。
(8)对象构造器规范
对象构造器用于构造类型(实体型、关联型、复杂类型)的对象。ODM采用开放式设计原则,符合以下规范的任何程序块均可作为对象构造器接入模型。
(9)取值器规范
取值器用于从对象中获取属性值、关联引用对象或关联端对象。ODM采用开放式设计原则,符合以下规范的任何程序块均可作为取值器接入模型。
(10)设值器规范
设置器用于为对象的属性、关联引用或关联端设置值。ODM采用开放式设计原则,符合以下规范的任何程序块均可作为设值器接入模型。
本发明以所述对象数据模型为基础,创立了一套方法用于将对象保存到关系存储系统和从关系存储系统查询对象,其具体实现步骤如下:
(一)将对象保存到关系存储系统
第1步,接受业务系统建立的对象数据模型,该模型特定于该业务系统中运行的对象系统。
第2步,根据要保存的对象(下称目标对象)的类型名从所述模型中查找对应的实体型或关联型(下称目标型),如果目标型为实体型则判定该对象为实体对象,如果为关联型则判定为关联对象。
第3步,如果目标型为实体型,遍历其所有关联引用,选出其关联型为伴随关联且伴随端为左端(关联引用.关联型.关联端集[关联引用.左端名])的关联引用,使用其取值器取出关联引用对象,将这些对象存入容器A。
特别地,如果上述关联为隐式关联,则首先使用模板类ImplicitAssociation<TEnd1,TEnd2>创建隐式关联对象,将此隐式关联对象放入容器A。模板类ImplicitAssociation<TEnd1,TEnd2>定义如下:
第4步,生成SQL语句。如果目标对象为新对象且目标型不为伴随关联型,SQL语句形式如下:
否则,SQL语句的形式如下:
其中:
方括号表示其中的内容为可选的;
relation为目标型的映射名;
attr1,attr2,…为关系的属性列表,如果目标型为实体型,该列表的各项对应于该实体型各属性的映射名,如果目标型为关联型,该列表包含该关联型各属性的映射名,还包含各关联端映射规则中的映射名;
comp1_attr1,comp1_attr2,…也为关系的属性列表,该列表的各项对应于容器A中第一个伴随关联对象所属关联型的各属性的映射名;
key_attr1和key_attr2为关系的主属性,对于实体型,其为该实体型的标识属性的映射名,对于关联型,其为各关联端映射规则的映射名;
@attr1、@attr2、@comp1_attr1、@comp1_attr2、@comp2_attr1、@comp2_attr2、@key_attr1、@key_attr2均为所述SQL语句的参数。
第5步,使用各属性的取值器从对象获取属性值,分别作为相应参数的取值。例如,假设实体型属性P1的映射名为attr1,使用P1的取值器获取的值即为参数@attr1的取值。
特别地,如果要获取其值的属性位于关联端对象,首先使用该关联端的取值器获取该关联端对象,然后再从该关联端对象获取属性值。
第6步,执行所述SQL语句。
(二)从关系存储系统查询对象
第1步,接受业务系统建立的对象数据模型,该模型特定于该业务系统中运行的对象系统。
第2步,确定目标型,即根据要查询的对象的类型名从所述模型中查找对应的实体型或关联型,如果找到的为实体型则判定该对象为实体对象,如果为关联型则判定为关联对象。
第3步,接受用户输入的查询条件,形如:
A1 relation_op value1[(AND|OR)A2 relation_op value2[(AND|OR)…]],
其中:
方括号表示其中的内容为可选的;
竖线表示其两边的内容可选其一且必选其一;
A1、A2为目标型的属性;
relation_op为关系运算符,支持等于(=)、大于(>)、小于(<)、不大于(<=)、不小于(>=)、不等于(<>)、模糊匹配(LIKE)、包含(IN)、不包含(NOT IN)9种关系运算;
value1、value2为用户输入的常量,如果relation_op不为IN也不为NOT IN,其值为字符串或数值型常量,否则为字符串或数值型常量列表。
第4步,生成查询SQL语句。如果目标型为实体型,SQL语句形式如下:
SELECT r.attr1 AS alias1,r.attr2 AS alias2,…
FROM relation r
WHERE criteria_exp。
如果目标型为关联型,SQL语句形式如下:
其中:
方括号表示其中的内容为可选的;
竖线表示其两边的内容可选其一且必选其一;
relation r,其中relation为目标型的映射名,r为目标型的名称;
end1_relation end1,其中end1_relation为关联型第一个关联端的实体型的映射名,end1为该关联端的名称;
r.attr1 AS alias1,其中attr1为目标型第一个属性(A1)的映射名,alias1为r+‘_’+A1.名称;
end1.attr1 AS end1_alias1,其中attr1为第一个关联端的实体型的第一个属性(A1)的映射名,end1_alias1为end1+‘_’+A1.名称;
r.end1_key_attr1=end1.key_attr1,其中end1_key_attr1为关联型第一个关联端的映射规则中第一个标识属性的映射名,key_attr1为该关联端的实体型中该标识属性的映射名。
criteria_exp为查询条件表达式,由第二步中的查询条件转换而来,转换规则为将属性A1、A2、……替换为其对应的映射名。
第5步,执行所述SQL语句,得到查询结果集。
第6步,遍历所述查询结果集各行,对每一行执行对象创建操作,并返回所创建对象组成的集合。其中,对象创建操作的步骤如下:
第6.1步,使用所述目标型的构造器创建对象;
第6.2步,遍历所述目标型的属性清单,对每一属性使用其设值器为相应对象属性设值,该值为CurrentRow[目标型.名称+‘_’+属性.名称],其中CurrentRow为查询结果集的当前行;
第6.3步,如果所创建的对象为关联对象(即目标型为关联型),对其每一个关联端执行“创建关联端对象”操作,如果所创建的对象为实体对象(即目标型为实体型),对其每一个关联引用执行“加载关联引用对象”操作。
(三)创建关联端对象
第1步,接收调用方传入的查询结果集和要为其创建对象的关联端(目标关联端);
第2步,使用目标关联端的实体型的构造器创建对象;
第3步,遍历上述实体型的各属性,对每一属性使用其设值器为相应对象属性设值,该值为CurrentRow[目标关联端.名称+‘_’+属性.名称],其中CurrentRow为第1步所述查询结果集的当前行;
第4步,遍历上述实体型的各关联引用,执行“加载关联引用”操作;
第5步,使用目标关联端的设值器,将上述对象设置为该关联端的值。
(四)加载关联引用对象
第1步,确定要从关系存储系统查询的目标型(实体型或关联型):如果要加载的关联引用的关联型为隐式关联,目标型=关联引用.关联型.关联端集[关联引用.右端名].实体型;否则,目标型=关联引用.关联型。
第2步,生成查询SQL语句。如果所述关联型为隐式关联且右端(右端=关联引用.关联型.关联端集[关联引用.右端名])不为伴随端(即为独立关联或左端为伴随端),SQL语句的形式如下:
其中:
relation r,其中relation为目标型的映射名,r为目标型的名称;
asso_relation ar,其中asso_relation为关联引用的关联型的映射名,ar为关联引用的名称;
end1_relation end1,其中end1_relation为关联型第一个关联端的实体型的映射名,end1为该关联端的名称;
attr1 AS alias1,其中attr1为目标型第一个属性(A1)的映射名,alias1为r+‘’+A1.名称;
right_attr1=key_attr1,其中right_attr1为右端的映射规则中第一个标识属性的映射名,key_attr1为右端的实体型中该标识属性的映射名;
left_attr1=@left_attr1,其中left_attr1为左端的映射规则中第一个标识属性的映射名,参数@left_attr1的值来源于该标识属性在左端对象(即要加载的关联引用所属的对象)中的值;
end1.attr1 AS end1_alias1,其中attr1为第一个关联端的实体型的第一个属性(A1)的映射名,end1_alias1为end1+‘_’+A1.名称;
r.end1_key_attr1=end1.key_attr1,其中end1_key_attr1为所述关联型的第一个关联端的映射规则中第一个标识属性的映射名,key_attr1为该关联端的实体型中该标识属性的映射名。
第3步,使用相应属性的取值器获取上述SQL语句各参数的值;
第4步,执行“从关系存储系统查询对象”中所述之第5-6步;
第5步,使用所述关联引用的设值器,将上一步创建的对象设置为关联引用的值。
应用实施例1
如附图2所示,本发明已实际应用于一个在线商品展示平台,该平台的对象系统结构如下图所示:
该对象系统的结构比较复杂,主要体现在以下几点:
a.商品(Goods)、属性(Property)和属性值(PropertyValue)之间存在多(三)方关联“商品属性取值(枚举值)”;
b.上述关联为显式关联,即存在一个关联对象(GoodsPropertyValue),且该对象具有属性;
c.商品和属性之间存在一个显式关联“商品属性取值(自行输入值)”,关联对象为GoodsPropertyValue;
d.SKU对象不具有指向商品的外键属性,即Goodsld;
e.SKU对象的属性_skultems(包含sku各分项)是一个集合,它映射到一个关系属性,因此需要将该集合Json序列化或反序列化;
f.由于商品内部管理属性取值和SKU的业务规则非常复杂,不能使用属性访问器向外部暴露指向属性取值和SKU的关联指针,只能通过一组特定的方法进行读写。
因此,现有的ORM技术(包括EF和Hibernate)均不能支持,而采用本发明提供的技术方案则可以顺利实现上述对象系统的OR映射。目前,所述在线商品展示平台已正式运行超过一个月,OR映射相关的预定需求已全部实现且运行正常。
如附图3所示,本实施例提供一种根据所述对象关系映射方法实现的装置。该装置包括三个部分,如下图所示。
模型管理单元负责管理装置使用者建立的特定于具体对象系统的对象数据模型。模型本质上是一批具有特定含义且相互关联的数据项,模型管理单元的任务就是将这些数据项分类存储以便查询,具体方案如下:
定义表示实体型的类EntityType,该类具有与实体型元数据结构一致内部数据结构,同时内含两个容器,分别存储实体型所含的属性和关联引用;
定义表示关联型的类AssociationType,该类具有与关联型元数据结构一致的内部数据结构,同时内含两个容器,分别存储关联型所含的属性和关联端;
定义表示复杂类型的类ComplexType,该类具有与复杂类型元数据结构一致的内部数据结构,同时内含一个容器,存储复杂类型所含的属性;
定义表示属性的类Attribute,该类具有与属性元数据结构一致的内部数据结构;
定义表示关联引用的类AssociationReference,该类具有与关联引用元数据结构一致的内部数据结构;
定义表示关联端的类AssociationEnd,该类具有与关联端元数据结构一致的内部数据结构,同时内含一个容器,存储关联端映射规则。
模型管理单元提供以下三个接口供装置其它部分查询模型:
实体型查询接口,输入参数为一个对象类型,输出为EntityType类的一个实例,如果没有与输入参数对应的实体型则返回空引用;
关联型查询接口,输入参数为一个对象类型,输出为AssociationType类的一个实例,如果没有与输入参数对应的关联型则返回空引用;
复杂类型查询接口,输入参数为一个结构化数据类型,输出为ComplexType类的一个实例,如果没有与输入参数对应的复杂类型则返回空引用。
进一步地,装置其它部分可以利用EntityType、AssociationType、ComplexType类的相应接口从上述返回的实例中分别查询实体型元数据、实体型属性、关联引用、关联型元数据、关联型属性、关联端、复杂类型元数据、复杂类型属性。更进一步地,装置其它部分还可以利用Attribute、AssociationReference、AssociationEnd类的相应接口查询上述属性、关联引用和关联端的元数据。
SQL生成单元负责生成供说明书所述对象关系映射方法使用的三种SQL语句:将对象保存至关系存储系统的SQL语句,简称对象保存SQL;从关系存储系统查询对象的SQL语句,简称对象查询SQL;加载关联引用的SQL语句,简称关联引用加载SQL。三种SQL语句的生成方法已在说明书中详细说明,此处不再赘述。
生成SQL语句的过程中,如果需要查询模型则调用上述模型管理单元的相应接口。
映射执行单元是本装置的核心部件,负责执行具体的映射逻辑。同时也是本装置对外的接口,向使用者提供两个接口:对象保存接口和对象查询接口。
对象保存接口,负责将指定对象保存至关系存储系统,输入参数是要保存的对象和一个布尔值,指示该对象是否为新对象。本接口按说明书中“将对象保存到关系存储系统”一节所述的步骤执行任务,需要查询模型时调用上述模型管理单元的相应接口,执行第4步(生成SQL语句)时调用上述SQL生成单元生成对象保存SQL。
对象查询接口,负责从关系存储系统中查询对象,输入参数是要查询的对象的类型和查询条件(形式如说明书“从关系存储系统查询对象”一节第3步所述),输出是查出的对象的集合。本接口按说明书中“从关系存储系统查询对象”一节所述的步骤执行任务,需要查询模型时调用上述模型管理单元的相应接口,执行第4步(生成SQL语句)时调用上述SQL生成单元生成对象查询SQL。
以上所述仅是本发明的优选应用实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (8)
1.一种基于对象数据模型的对象关系映射方法,以描述对象系统及其与关系系统映射规则的元数据体系为基础,其特征在于,具体方法步骤如下:
构建对象系统形式模型,并命名为对象数据模型;
将对象保存到关系存储系统;
从关系存储系统查询对象;
创建关联端对象;
加载关联引用对象。
2.如权利要求1所述的对象数据模型,基特征在于:
使用一组具有特定含义的数据项描述对象系统中的实体对象及其内部的属性和关联指针,说明实体对象与关系映射的规则;
描述对象系统中的链及其各端,说明链与关系映射的规则;
依据链在对象系统中是否有相应的关联对象,将链分为显式关联和隐式关联两种,对有关联对象的链进一步对其属性进行描述;
依据链和其端对象是否与同一关系映射,将链的映射分成伴随映射和独立映射两种,并对两种映射执行不同的映射逻辑;
定义构造器规范,只要符合此规范的程序块均可被所述模型识别,供ORM程序调用以创建对象;
定义取值器规范,只要符合此规范的程序块均可被所述模型识别,供ORM程序调用以获取对象属性值、关联引用对象或关联端对象;
定义设值器规范,只要符合此规范的程序块均可被所述模型识别,供ORM程序调用以设置对象属性值、关联引用对象或关联端对象。
3.如权利要求1所述的将对象保存到关系存储系统子方法,其特征在于包含以下步骤:
接受业务系统建立的特定于该业务系统的对象系统的对象数据模型;
根据要保存对象的类型从所述模型中查找对应的实体型或关联型(下称目标型);
如果目标型为实体型,选出关联型为伴随关联且左端为伴随端的关联引用,使用其取值器取出关联引用对象,将这些对象存入容器A,(特别地,如果上述关联为隐式关联,则首先创建隐式关联对象,将此隐式关联对象放入容器A);
生成对象保存SQL;
使用各属性的取值器从对象获取属性值,分别作为相应SQL语句参数的取值,(特别地,如果要获取其值的属性位于关联端对象,首先使用该关联端的取值器获取该关联端对象,然后再从该关联端对象中获取属性值);
执行所述SQL语句。
4.如权利要求1所述的从关系存储系统查询对象子方法,其特征在于包含以下步骤:
接受业务系统建立的特定于该业务系统的对象系统的对象数据模型;
确定目标型,即根据要查询的对象的类型名从所述模型中查找对应的实体型或关联型;
接受用户输入的查询条件;
生成对象查询SQL;
执行所述SQL语句,得到查询结果集;
遍历所述查询结果集各行,每一行创建一个对象,如果所建对象为关联对象,为其每一个关联端创建关联端对象,如果所建对象为实体对象,为其每一个关联引用加载关联引用对象。
5.如权利要求4所述的创建关联端对象,其特征在于包含以下步骤:
接收调用方传入的查询结果集和要为其创建对象的关联端(目标关联端);
使用目标关联端的实体型的构造器创建对象;
遍历上述实体型的各属性,对每一属性使用其设值器为相应的对象属性设值,该值来源于所述查询结果集当前行;
遍历上述实体型的各关联引用,对每一关联引用加载关联引用对象;
使用目标关联端的设值器,将所建对象设置为该关联端的值。
6.如权利要求4或5所述的加载关联引用对象,其特征在于,包含以下步骤:
确定要从关系存储系统查询的目标型(实体型或关联型);
生成关联引用加载SQL;
使用相应属性的取值器获取上述SQL语句各参数的值;
执行权利要求4所述的从关系存储系统查询对象子方法的最后两步;
使用所述关联引用的设值器,将上一步创建的对象设置为关联引用的值。
7.根据权利要求1所述的方法实现的通用对象关系映射装置,其特征在于包含:
映射执行单元,执行具体的映射逻辑,同时向使用者公开本装置的使用接口;
SQL生成单元,生成供映射执行单元使用的对象保存SQL语句、对象查询SQL语句和引用加载SQL语句;
模型管理单元,管理装置使用者建立的特定于具体对象系统的对象数据模型,并提供模型元数据项的查询接口。
8.如权利要求7所述的模型管理单元,其特征在于:
将用于描述对象系统及其与关系系统映射规则的元数据项分类存储;
提供一组接口供装置其它部分查询所述元数据项。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710395918.4A CN108984541A (zh) | 2017-05-31 | 2017-05-31 | 一种基于对象数据模型的对象关系映射方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710395918.4A CN108984541A (zh) | 2017-05-31 | 2017-05-31 | 一种基于对象数据模型的对象关系映射方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108984541A true CN108984541A (zh) | 2018-12-11 |
Family
ID=64501037
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710395918.4A Pending CN108984541A (zh) | 2017-05-31 | 2017-05-31 | 一种基于对象数据模型的对象关系映射方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108984541A (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111008189A (zh) * | 2019-11-26 | 2020-04-14 | 浙江电子口岸有限公司 | 一种动态数据模型构建方法 |
CN111797277A (zh) * | 2020-05-19 | 2020-10-20 | 武汉乐程软工科技有限公司 | 映射对象系统与关系系统的方法、装置、计算机读存储介质及终端设备 |
CN111797278A (zh) * | 2020-05-19 | 2020-10-20 | 武汉乐程软工科技有限公司 | 一种映射关联对象与关系的方法 |
CN113656433A (zh) * | 2021-08-16 | 2021-11-16 | 北京京东振世信息技术有限公司 | 实体对象扩展方法、装置、电子设备和存储介质 |
CN113742361A (zh) * | 2021-08-25 | 2021-12-03 | 的卢技术有限公司 | Js开发环境下使用sql存储json数据的方法及系统 |
CN114553954A (zh) * | 2022-04-21 | 2022-05-27 | 北京时代亿信科技股份有限公司 | 信息推送方法、装置、非易失性存储介质及电子设备 |
CN114764326A (zh) * | 2022-03-30 | 2022-07-19 | 中国石油天然气集团有限公司 | 一种一体化软件的数据层扩展方法和系统 |
-
2017
- 2017-05-31 CN CN201710395918.4A patent/CN108984541A/zh active Pending
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111008189A (zh) * | 2019-11-26 | 2020-04-14 | 浙江电子口岸有限公司 | 一种动态数据模型构建方法 |
CN111008189B (zh) * | 2019-11-26 | 2023-08-25 | 浙江电子口岸有限公司 | 一种动态数据模型构建方法 |
CN111797277A (zh) * | 2020-05-19 | 2020-10-20 | 武汉乐程软工科技有限公司 | 映射对象系统与关系系统的方法、装置、计算机读存储介质及终端设备 |
CN111797278A (zh) * | 2020-05-19 | 2020-10-20 | 武汉乐程软工科技有限公司 | 一种映射关联对象与关系的方法 |
CN113656433A (zh) * | 2021-08-16 | 2021-11-16 | 北京京东振世信息技术有限公司 | 实体对象扩展方法、装置、电子设备和存储介质 |
CN113656433B (zh) * | 2021-08-16 | 2023-09-05 | 北京京东振世信息技术有限公司 | 实体对象扩展方法、装置、电子设备和存储介质 |
CN113742361A (zh) * | 2021-08-25 | 2021-12-03 | 的卢技术有限公司 | Js开发环境下使用sql存储json数据的方法及系统 |
CN113742361B (zh) * | 2021-08-25 | 2024-05-28 | 西藏宁算科技集团有限公司 | Js开发环境下使用sql存储json数据的方法及系统 |
CN114764326A (zh) * | 2022-03-30 | 2022-07-19 | 中国石油天然气集团有限公司 | 一种一体化软件的数据层扩展方法和系统 |
CN114764326B (zh) * | 2022-03-30 | 2023-09-19 | 中国石油天然气集团有限公司 | 一种一体化软件的数据层扩展方法和系统 |
CN114553954A (zh) * | 2022-04-21 | 2022-05-27 | 北京时代亿信科技股份有限公司 | 信息推送方法、装置、非易失性存储介质及电子设备 |
CN114553954B (zh) * | 2022-04-21 | 2022-09-02 | 北京时代亿信科技股份有限公司 | 信息推送方法、非易失性存储介质及电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108984541A (zh) | 一种基于对象数据模型的对象关系映射方法及装置 | |
US6976020B2 (en) | Software composition using graph types, graph, and agents | |
Pardillo et al. | Using ontologies for the design of data warehouses | |
US20080183725A1 (en) | Metadata service employing common data model | |
US11023468B2 (en) | First/last aggregation operator on multiple keyfigures with a single table scan | |
US20050234889A1 (en) | Method and system for federated querying of data sources | |
CN101617292A (zh) | 面向生成器图形的编程和执行 | |
CN101601012A (zh) | 具有场景支持的面向生成器图形的编程框架 | |
US20100131568A1 (en) | System, method and structures for a reusable custom-defined nestable compound data type for construction of database objects | |
CN110019314B (zh) | 基于数据项分析的动态数据封装方法、客户端和服务端 | |
Holubová et al. | Evolution Management of Multi-model Data: (Position Paper) | |
WO2019015364A1 (zh) | 执行结构化查询语言sql指令的方法和装置 | |
US20100131565A1 (en) | Method for creating a self-configuring database system using a reusable custom-defined nestable compound data type | |
CN109359128A (zh) | 在对象系统与关系系统之间实现映射的方法 | |
CN117520514A (zh) | 一种问答任务处理方法、装置、设备及可读存储介质 | |
EP2425382B1 (en) | Method and device for improved ontology engineering | |
Mordinyi et al. | Evaluation of NoSQL graph databases for querying and versioning of engineering data in multi-disciplinary engineering environments | |
Costa et al. | Methodology for data integration using sparql constructs in the aec industry | |
CN108139893B (zh) | 基于组件的软件系统及开发方法 | |
Du et al. | A schema aware ETL workflow generator | |
Roy-Hubara et al. | Exploring the design needs for the new database era | |
Golobisky et al. | Fundamentals for the Automation of Object-Relationa Database Design | |
Price et al. | A Higher-order data flow model for heterogeneous Big Data | |
CN1322418C (zh) | 实现对象持续化服务的系统及其方法 | |
Gaafar et al. | Towards a framework for mapping between UML/OCL and XML/XQuery |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
DD01 | Delivery of document by public notice | ||
DD01 | Delivery of document by public notice |
Addressee: Chen Rui Document name: Notification of Publication of the Application for Invention |
|
DD01 | Delivery of document by public notice | ||
DD01 | Delivery of document by public notice |
Addressee: Chen Rui Document name: Deemed as a notice of withdrawal |
|
WD01 | Invention patent application deemed withdrawn after publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20181211 |