在对象系统与关系系统之间实现映射的方法与流程

文档序号:16918789发布日期:2019-02-19 19:10阅读:337来源:国知局
在对象系统与关系系统之间实现映射的方法与流程

本发明属于计算机技术领域,具体为在对象系统与关系系统之间实现映射的方法。



背景技术:

面向对象软件开发思想将软件系统看作对象及对象之间的关系(即对象系统),系统的运行体现为对象之间的相互作用,而将系统数据的存储看作对对象当前状态实施的持久化操作。在当前软件工程中,经常需要将数据存储到关系数据库中,以便进行应用访问,而且几乎所有的存储系统都采用关系型数据结构。由于对象系统的结构与关系数据结构往往存在显著差异且该难题一直未被有效解决。故自面向对象开发普及以来,如何实现对象系统与关系系统间的映射(orm,即对象关系映射)一直是一个难题。

传统的做法是在软件开发中编写专门的转换代码(一般属于“数据访问层”)。这一工作是烦琐而枯燥的,并且通常会占据开发团队大量的时间。因此,开发人员希望编写出一种对象系统无关的通用orm程序。目前常用的orm程序有微软公司研发的entityframework(简称ef)和开源项目hibernate。

但是,发明人在本申请的研究过程中发现,采用现有技术进行orm映射时,还存在一定的问题:

(1)不支持多方关联,只支持二方关联,

(2)不支持复杂关联(即拥有属性的关联);

(3)不能描述关联对象(对象系统中的一种特殊对象,不同于实体对象);

(4)取值和设值只能通过属性访问器,而对于复杂对象来说,其某些属性或关联指针可能不宜对外开放;

(5)取值和设值机制不具可扩展性,不支持业务系统插入特殊映射逻辑;

(6)关联的映射(即对象间关系的映射)依赖外键属性,而有些对象可能不具有外键属性。

这些问题限制了orm程序的应用范围,通常只能应用于简单对象系统。



技术实现要素:

本发明的目的是克服现有技术的不足,将orm程序的适用范围扩展至复杂对象系统。首先定义了用于描述对象系统的形式模型,称为对象数据模型,然后在该模型基础上分别发明了将对象系统保存到关系系统的方法和从关系系统提取对象系统的方法。

1.对象数据模型

使用一组具有特定含义的数据项描述对象系统中的实体对象及其内部的属性和关联指针,说明实体对象与关系映射的规则;

描述对象系统中的链及其各端,说明链与关系映射的规则;

依据链在对象系统中是否有相应的关联对象,将链分为显式关联和隐式关联两种,对有关联对象的链进一步对其属性进行描述;

依据链和其端对象是否与同一关系映射,将链的映射分成伴随映射和独立映射两种,并对两种映射执行不同的映射逻辑;

定义构造器规范,只要符合此规范的程序块均可被所述模型识别,供orm程序调用以创建对象;

定义取值器规范,只要符合此规范的程序块均可被所述模型识别,供orm程序调用以获取对象属性值、关联引用对象或关联端对象;

定义设值器规范,只要符合此规范的程序块均可被所述模型识别,供orm程序调用以设置对象属性值、关联引用对象或关联端对象。

2.将对象系统保存到关系系统

建立描述特定对象系统的对象数据模型;

根据要保存对象的类型从所述模型中查找对应的实体型或关联型(下称目标型);

如果目标型为实体型,选出关联型为伴随关联且左端为伴随端的关联引用,使用其取值器取出关联引用对象,将这些对象存入容器a,(特别地,如果上述关联为隐式关联,则首先创建隐式关联对象,将此隐式关联对象放入容器a);

生成对象保存sql;

使用各属性的取值器从对象获取属性值,分别作为相应sql语句参数的取值,(特别地,如果要获取其值的属性位于关联端对象,首先使用该关联端的取值器获取该关联端对象,然后再从该关联端对象中获取属性值);

执行所述sql语句。

3.从关系系统提取对象系统

建立描述特定对象系统的对象数据模型;

确定目标型,即根据要查询的对象的类型名从所述模型中查找对应的实体型或关联型;

接受用户输入的查询条件;

生成对象查询sql;

执行所述sql语句,得到查询结果集;

遍历所述查询结果集各行,每一行创建一个对象,如果所建对象为关联对象,为其每一个关联端创建关联端对象,如果所建对象为实体对象,为其每一个关联引用加载关联引用对象。

进一步地,所述的创建关联端对象,其具体步骤如下:

接收调用方传入的查询结果集和要为其创建对象的关联端(目标关联端);

使用目标关联端的实体型的构造器创建对象;

遍历上述实体型的各属性,对每一属性使用其设值器为相应的对象属性设值,该值来源于所述查询结果集当前行;

遍历上述实体型的各关联引用,对每一关联引用加载关联引用对象;

使用目标关联端的设值器,将所建对象设置为该关联端的值。

进一步地,所述的加载关联引用对象,其具体步骤如下:

确定要从关系存储系统查询的目标型(实体型或关联型);

生成关联引用加载sql;

使用相应属性的取值器获取上述sql语句各参数的值;

执行所述从关系系统提取对象系统方法之第5-6步;

使用所述关联引用的设值器,将上一步创建的对象设置为关联引用的值。

本发明的优点和有益效果是:本发明方法通过构建对象数据模型并以此为基础进行对象关系映射,可以扩展orm程序的通用性、支持多方复杂关联;允许业务系统自定义取值和设置方式;在无外键属性的情况下也可以实现关联的映射。

附图说明

图1是本发明方法中对象数据模型结构示意图;

图2是本发明应用于一个在线商品展示平台的对象系统结构示意图。

具体实施方式

以下结合本发明结构附图和实施例对本发明作进一步描述,实施例的描述仅为便于理解和应用本发明,而非对本发明保护的限制。

(一)定义对象数据模型

计算机无法从语义层面理解对象系统,因此必须对对象系统做形式化描述,以便计算机能够根据这种描述正确地“理解”对象系统,这种形式化描述称为对象系统的形式模型。形式模型是orm程序访问对象系统的“地图”,它依照地图在对象系统中搜寻数据、向对象系统写入数据,并按地图指定的路径与关系系统进行数据交互。因此,对象系统形式模型是orm程序的基础与灵魂。

该模型一方面对对象系统中的对象及对象间关系进行抽象描述,另一方面定义了其自身与关系模型的映射规则。在将对象转换为关系元组时(持久化操作),orm程序依照模型的指引从对象系统内部获取对象状态数据,然后根据映射规则生成关系元组;在将关系元组转换为对象时(反持久化操作),orm程序根据映射规则从关系元组中读取数据,然后根据模型的指引将数据注入到对象系统。

如附图1所示,本发明首先设计了一种全新的对象系统形式模型,称为对象数据模型(objectdatamodel,简称odm),其基本构造块为实体型和关联型。实体型描述对象系统中的实体对象,包含至少一个属性,用于描述对象的属性。实体型与关系映射,其所描述的对象映射为该关系的元组;实体型的属性与该关系的属性映射,其所描述的属性的值映射为该元组的元素。关联型(也称为关联)描述对象系统中的链(即对象间的关系),包含至少两个关联端,用于描述链的各端。如果对象系统中存在一个代表该链的关联对象,那么该关联为显式关联,否则为隐式关联。显式关联通常包含属性,用于描述关联对象的属性。关联型与关系映射,其所描述的链映射为该关系的元组;关联端与该关系的主属性映射,关联端对象的标识属性的值映射为主属性的值;关联型的属性与该关系的属性映射,其所描述的属性的值映射为该元组的元素。

实体型还可以包含若干个关联引用,用于描述对象内部的关联指针,该指针指向链另一端的对象或者代表该链的关联对象。

1.实体型

实体型是对象数据模型的基本构造块,用于描述对象系统中的实体对象,一个对象类型(class)对应一个实体型。实体型与关系映射,其所描述的对象映射为该关系的元组。实体型的元数据结构如下:

(1)命名空间;

(2)名称,实体型的标识,在命名空间范围内唯一;

(3)标识属性,指定能够唯一标识一个对象的一个或一组属性,一个实体型有且仅有一个或一组标识属性;

(4)标识是否自增,指示标识属性是否自增;

(5)构造器,用于创建实体对象的程序块,必须符合《对象构造器规范》;

(6)映射名,与实体型映射的关系的名称。

此外,实体型包含至少一个属性,可以包含若干个关联引用。

2.关联型

关联型简称关联,也是对象数据模型的基本构造块,用于描述对象系统中的链(即对象间的关系),一个关联型对应一种类型的链。与实体型一样,关联型也与关系映射,其所描述的链映射为该关系的元组。

如果对象系统中存在一个代表该链的关联对象,那么该关联为显式关联,否则为隐式关联。

关联型的元数据结构如下:

(1)命名空间;

(2)名称,关联型的标识,在命名空间范围内唯一;

(3)构造器,用于构造关联对象的程序块,必须符合《对象构造器规范》;

(4)是否为显式关联,指示关联是否为显式关联;

(5)映射名,与关联映射的关系的名称。

关联型包含至少两个关联端。显式关联可以包含属性(称为“关联属性”),如果包含则称其为复杂关联,否则为简单关联。

如果与关联映射的关系与其某一关联端的实体型的映射关系相同,该关联称为伴随关联,这种映射称为伴随映射,该关联端称为伴随关联端(简称伴随端);否则该关联称为独立关联,这种映射称为独立映射。

3.属性

属性用于描述对象(实体对象或关联对象)的属性,一个属性对应一个对象属性。属性与关系的属性映射,其所描述的属性的值映射为关系元组的元素。属性的元数据结构如下:

(1)名称,属性的标识,在实体型或关联型内唯一;

(2)数据类型,属性值的数据类型,如整型、字符串型等;

(3)取值器,用于从对象获取属性值的程序块,必须符合《取值器规范》;

(4)设值器,用于为对象的属性设值的程序块,必须符合《设值器规范》;

(5)映射名,与该属性映射的关系属性的名称。

属性分为简单属性和复杂属性。简单属性是指其值为基元类型的属性。复杂属性是指其值为复杂类型的属性。

4.基元类型

对象数据模型支持9种基元类型:字节型、整型、长整型、布尔型、浮点型(单精度)、浮点型(双精度)、字符型、字符串型、日期时间型。

5.复杂类型

复杂类型用于描述建构对象系统的复杂数据类型(如struct),由至少2个属性组合而成,其中属性既可以是简单属性也可以是复杂属性(该复杂属性的类型不能为该复杂类型自身)。

复杂类型的元数据结构如下:

(1)命名空间;

(2)名称,复杂类型的标识,在命名空间范围内唯一;

(3)构造器,用于构造复杂类型实例的程序块,必须符合《对象构造器规范》。

6.关联引用

关联引用用于描述对象内部的关联指针,该指针指向链另一端的对象或者代表该链的关联对象,通常对象所参与的每一个链都对应有一个关联指针。关联引用的元数据结构如下:

(1)名称,关联引用的标识,在关联型内部唯一;

(2)关联型,即描述链的关联型;

(3)左端名,关联指针所属的对象对应的关联端的名称;

(4)右端名,关联指针指向的对象对应的关联端的名称;

(5)取值器,用于从对象中获取关联引用对象(即关联指针的值)的程序块,必须符合《取值器规范》;

(6)设值器,用于设置关联引用对象的程序块,必须符合《设值器规范》。

7.关联端

关联端用于描述链的端。其元数据结构如下:

(1)名称,关联端的标识,在关联型内部唯一;

(2)实体型,即描述链端对象的实体型;

(3)关联重数,链端对象的数量约束,可以为一个、多个、一个或多个;

(4)取值器,用于从关联对象获取关联端对象(即位于链的某一端的对象)的程序块,必须符合《取值器规范》;

(5)设值器,为关联对象设置关联端对象的程序块,必须符合《设值器规范》;

(6)映射规则,指定关联端对象的标识属性与关系属性的映射,一个标识属性与一个关系属性映射。

8.对象构造器规范

对象构造器用于构造类型(实体型、关联型、复杂类型)的对象。odm采用开放式设计原则,符合以下规范的任何程序块均可作为对象构造器接入模型。

publicinterfaceiconstructor{

///<summary>

///构造对象。

///</summary>

///<returns>构造出的对象。</returns>

objectconstruct();

}

9.取值器规范

取值器用于从对象中获取属性值、关联引用对象或关联端对象。odm采用开放式设计原则,符合以下规范的任何程序块均可作为取值器接入模型。

publicinterfaceivaluegetter{

///<summary>

///从指定对象取属性值、关联引用对象或关联端对象。

///</summary>

///<paramname="obj">目标对象</param>

objectgetvalue(objectobj);

}

10.设值器规范

设置器用于为对象的属性、关联引用或关联端设置值。odm采用开放式设计原则,符合以下规范的任何程序块均可作为设值器接入模型。

publicinterfaceivaluesetter{

///<summary>

///为对象设置属性值、关联引用对象或关联端对象。

///</summary>

///<paramname="obj">目标对象</param>

///<paramname="value">属性值、关联引用对象或关联端对象</param>

voidsetvalue(objectobj,objectvalue);

}

本发明以所述对象数据模型为基础,创立了将对象系统保存到关系系统和从关系系统提取对象系统的方法。

(二)实施例一:将对象系统保存到关系系统

第1步,接受业务系统建立的对象数据模型,该模型特定于该业务系统中运行的对象系统。

第2步,根据要保存的对象(下称目标对象)的类型名从所述模型中查找对应的实体型或关联型(下称目标型),如果目标型为实体型则判定该对象为实体对象,如果为关联型则判定为关联对象。

第3步,如果目标型为实体型,遍历其所有关联引用,选出其关联型为伴随关联且伴随端为左端(关联引用.关联型.关联端集[关联引用.左端名])的关联引用,使用其取值器取出关联引用对象,将这些对象存入容器a。

特别地,如果上述关联为隐式关联,则首先使用模板类implicitassociation<tend1,tend2>创建隐式关联对象,将此隐式关联对象放入容器a。模板类implicitassociation<tend1,tend2>定义如下:

///<summary>

///为隐式关联提供默认的对象类型。

///类型参数tend1、tend2表示两个关联端的对象类型。

///</summary>

publicclassimplicitassociation<tend1,tend2>{

///<summary>

///第一个关联端对象

///</summary>

privatetend1_end1;

///<summary>

///第二个关联端对象

///</summary>

privatetend2_end2;

///<summary>

///获取或设置第一个关联端对象。

///</summary>

publicvirtualtend1end1{

get{

return_end1;

}

set{

_end1=value;

}

}

///<summary>

///获取或设置第二个关联端对象。

///</summary>

publicvirtualtend2end2{

get{

return_end2;

}

set{

_end2=value;

}

}

}

第4步,生成sql语句。如果目标对象为新对象且目标型不为伴随关联型,sql语句形式如下:

insertintorelation(

attr1,attr2,…,

comp1_attr1,comp1_attr2,…,

comp2_attr1,comp2_attr2,…,

……

)values(

@attr1,@attr2,…,

@comp1_attr1,@comp1_attr2,…,

@comp2_attr1,@comp2_attr2,…,

……

)。

否则,sql语句的形式如下:

updaterelation

setattr1=@attr1,attr2=@attr2,…,

comp1_attr1=@comp1_attr1,comp1_attr2=@comp1_attr2,…,

comp2_attr1=@comp2_attr1,comp2_attr2=@comp2_attr2,…,

……

wherekey_attr1=@key_attr1[andkey_attr2=@key_attr2[and…]]。

其中:

方括号表示其中的内容为可选的;

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步,接受用户输入的查询条件,形如:

a1relation_opvalue1

[(and|or)a2relation_opvalue2

[(and|or)…]],

其中:

方括号表示其中的内容为可选的;

竖线表示其两边的内容可选其一且必选其一;

a1、a2为目标型的属性;

relation_op为关系运算符,支持等于(=)、大于(>)、小于(<)、不大于(<=)、不小于(>=)、不等于(<>)、模糊匹配(like)、包含(in)、不包含(notin)9种关系运算;

value1、value2为用户输入的常量,如果relation_op不为in也不为notin,其值为字符串或数值型常量,否则为字符串或数值型常量列表。

第4步,生成查询sql语句。如果目标型为实体型,sql语句形式如下:

selectr.attr1asalias1,r.attr2asalias2,…

fromrelationr

wherecriteria_exp。

如果目标型为关联型,sql语句形式如下:

selectr.attr1asalias1,r.attr2asalias2,…,

end1.attr1asend1_alias1,end1.attr2asend1_alias2,…,

end2.attr1asend2_alias1,end2.attr2asend2_alias2,…,

……

fromrelationr

leftjoinend1_relationend1

onr.end1_key_attr1=end1.key_attr1

[andr.end1_key_attr2=end1.key_attr2

[and…]]

leftjoinend2_relationend2

onr.end2_key_attr1=end2.key_attr1

[andr.end2_key_attr2=end2.key_attr2

[and…]]

……

wherecriteria_exp。

其中:

方括号表示其中的内容为可选的;

竖线表示其两边的内容可选其一且必选其一;

relationr,其中relation为目标型的映射名,r为目标型的名称;

end1_relationend1,其中end1_relation为关联型第一个关联端的实体型的映射名,end1为该关联端的名称;

r.attr1asalias1,其中attr1为目标型第一个属性(a1)的映射名,alias1为r+‘_’+a1.名称;

end1.attr1asend1_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步,如果所创建的对象为关联对象(即目标型为关联型),对其每一个关联端执行“创建关联端对象”操作,如果所创建的对象为实体对象(即目标型为实体型),对其每一个关联引用执行“加载关联引用对象”操作。

第6.3步所述“创建关联端对象”具体步骤如下:

第1步,接收调用方传入的查询结果集和要为其创建对象的关联端(目标关联端);

第2步,使用目标关联端的实体型的构造器创建对象;

第3步,遍历上述实体型的各属性,对每一属性使用其设值器为相应对象属性设值,该值为currentrow[目标关联端.名称+‘_’+属性.名称],其中currentrow为第1步所述查询结果集的当前行;

第4步,遍历上述实体型的各关联引用,执行“加载关联引用”操作;

第5步,使用目标关联端的设值器,将上述对象设置为该关联端的值。

第6.3步所述“加载关联引用对象”具体步骤如下:

第1步,确定要从关系存储系统查询的目标型(实体型或关联型):如果要加载的关联引用的关联型为隐式关联,目标型=关联引用.关联型.关联端集[关联引用.右端名].实体型;否则,目标型=关联引用.关联型。

第2步,生成查询sql语句。如果所述关联型为隐式关联且右端(右端=关联引用.关联型.关联端集[关联引用.右端名])不为伴随端(即为独立关联或左端为伴随端),sql语句的形式如下:

selectr.attr1asalias1,r.attr2asalias2,…

fromasso_relationar

innerjoinrelationr

onar.right_attr1=r.key_attr1

[andar.right_attr2=r.key_attr2

[and…]]

wherear.left_attr1=@left_attr1

[andar.left_attr2=@left_attr2

[and…]]。

否则,如果所述关联型为显式关联,sql语句的形式如下:

selectr.attr1asalias1,r.attr2asalias2,…,

end1.attr1asend1_alias1,end1.attr2asend1_alias2,…,

end2.attr1asend2_alias1,end2.attr2asend2_alias2,…,

……

fromrelationr

leftjoinend1_relationend1

onr.end1_key_attr1=end1.key_attr1

[andr.end1_key_attr2=end1.key_attr2

[and…]]

leftjoinend2_relationend2

onr.end2_key_attr1=end2.key_attr1

[andr.end2_key_attr2=end2.key_attr2

[and…]]

……

wherear.left_attr1=@left_attr1

[andar.left_attr2=@left_attr2

[and…]]。

否则,sql语句的形式如下:

selectar.attr1asalias1,ar.attr2asalias2,…

fromasso_relationar

wherear.left_attr1=@left_attr1

[andleft_attr2=@left_attr2

[and…]]。

其中:

relationr,其中relation为目标型的映射名,r为目标型的名称;

asso_relationar,其中asso_relation为关联引用的关联型的映射名,ar为关联引用的名称;

end1_relationend1,其中end1_relation为关联型第一个关联端的实体型的映射名,end1为该关联端的名称;

attr1asalias1,其中attr1为目标型第一个属性(a1)的映射名,alias1为r+‘_’+a1.名称;

right_attr1=key_attr1,其中right_attr1为右端的映射规则中第一个标识属性的映射名,key_attr1为右端的实体型中该标识属性的映射名;

left_attr1=@left_attr1,其中left_attr1为左端的映射规则中第一个标识属性的映射名,参数@left_attr1的值来源于该标识属性在左端对象(即要加载的关联引用所属的对象)中的值;

end1.attr1asend1_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步,使用所述关联引用的设值器,将上一步创建的对象设置为关联引用的值。

(四)应用实施例

如附图2所示,本发明已实际应用于一个在线商品展示平台,该平台的对象系统结构如下图所示:

该对象系统的结构比较复杂,主要体现在以下几点:

a.商品(goods)、属性(property)和属性值(propertyvalue)之间存在多(三)方关联“商品属性取值(枚举值)”;

b.上述关联为显式关联,即存在一个关联对象(goodspropertyvalue),且该对象具有属性;

c.商品和属性之间存在一个显式关联“商品属性取值(自行输入值)”,关联对象为goodspropertyvalue;

d.sku对象不具有指向商品的外键属性,即goodsid;

e.sku对象的属性_skuitems(包含sku各分项)是一个集合,它映射到一个关系属性,因此需要将该集合json序列化或反序列化;

f.由于商品内部管理属性取值和sku的业务规则非常复杂,不能使用属性访问器向外部暴露指向属性取值和sku的关联指针,只能通过一组特定的方法进行读写。

因此,现有的orm技术(包括ef和hibernate)均不能支持,而采用本发明提供的技术方案则可以顺利实现上述对象系统的or映射。目前,所述在线商品展示平台已正式运行超过一个月,or映射相关的预定需求已全部实现且运行正常。

以上所述仅是本发明的优选应用实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1