EMStudio系列教程4--静态建模进阶
这篇文章的内容主要讲述与静态模型相关的一些概念方面的内容和EMStudio新增的内容。正确完整的理解相关的概念对开发者完成模型设计是有帮助的。由于EMStudio对UML标准作了裁剪和简化,所以这些概念是很容易理解和掌握的。

一.三种基本的关系
静态建模中使用到的三种基本关系是:关联关系(Association),聚合关系(Aggregation),组合关系(Composition)。下面我们给出这三个关系在EMStudio静态模型中的解释。

关联关系
关联关系可以用于表示两个实体之间的任何关系。当两个实体之间需要标识存在或者需要某种联系是,就可以使用关联关系来表示。当然事实上已经存在的关系不一定就需要标识出来,是否标识取决于设计者。一般的分寸是当前静态模型需要处理的或者属于当前静态模型问题域的关系才有必要标识出来。对于事实上不存在的关系,有时候也可以创建并标识出来。这个分寸的把握,取决于是否可以更好描述和设计静态模型为尺度。

总体来说关联关系是一种松散的关系,对关系双方没有什么约束,只是标识有这样一种关系的存在。在EMSTudio的静态模型中关联关系没有任何其它的语义了,所以没有对关联关系做任何附加操作。关联关系只是一种正确恰当描述模型的工具,对于开发者认识和理解静态模型起到帮助作用。

聚合关系
首先聚合关系是一种关联关系,但是聚合关系还具有关联关系不具备的其它语义。这些语义体现在以下几个方便: 1.源代码方面
聚合关系在源代码中是通过关系属性来体现的,也就是说聚合关系在关系的主方实体中表示为一个属性。

2.责任不同
在聚合关系中主方实体处于主动位置,承担着更多一些的责任。一般来说能被定义为聚合关系的,付方实体往往是主方实体的一个组成部分或者成员。比如:房子实体和窗户实体的关系,公司实体和员工实体的关系。

3.数据操作方面
在EMLib执行级联的激活操作时,聚合关系的付方实体也会被激活。但是这个操作是否被执行取决于关系的Minor Options—Active属性的取值,这个属性的值可以在实体设计器中修改。注意在新创建关系后,这个属性的默认值是false,也就是说不会执行级联激活付方实体的操作。

组合关系
首先组合关系是一种聚合关系,两者的区别是,组合关系的主方实体还需要对关系付方实体的生命周期负责。也就是说主方实体销毁时,需要负责销毁复方实体。这个语义是从源代码级别来理解的,对应于实际现实世界中,可以认为组合关系是一种比聚合关系更为紧密的联系。比如上例提到的房子和窗户是整体与部分关系,用聚合来表示。那么同样的人和心脏的关系也是部分与整体的关系,但这个关系可以用组合关系来表示,用于强调两者之间的紧密程度。当然这些判断的尺度不是绝对,是否紧密的理解也是可以不同的,所以最终应该由模型的设计者来决定使用哪一种关系来设计模型。

在数据库操作方面,EMLib执行级联的删除操作时,组合关系的付方实体也会被删除。但是这个操作是否被执行取决于关系的Minor Options—Delete属性的取值,这个属性的值可以在实体设计器中修改。注意在新创建关系后,这个属性的默认值是false,也就是说不会执行级联删除付方实体的操作。

二.同构关系,容器实体和同构实体
这部分内容是EMStudio对静态模型的扩展。首先解释一下什么是同构关系。当我们需要将不同的实体的数据保存在同一个数据表的时候就需要用同构关系。比如:实体A,B的数据希望能保存在同一个数据表C中,那么设计者可以定义实体A,B,C然后在A,C和B,C之间定义同构关系,并且让C成为关系的主方。这时关系的主方称为容器实体,关系的付方称为同构实体。这是对同构关系的一个简单版本的解释。

三.关系实体
关系实体来自于实体间的关系。通常来说关系只是一个关系,但是有的时候关系需要被设计成一个独立的实体,这样的实体就被称为关系实体。目前大部分建模工具都只支持二元的关系实体,也就是有两个实体参与的关系被设计成一个实体。EMStudio可以支持任意多个实体参与的关系实体,这是完整体现UML标准中关于关系实体的规定的。

打开先前章节使用到的那个工程,或者读者自己新建一个工程,在工程节点下创建一个新的实体图,改名为Advanced,然后打开该实体图。然后在实体图工具条中选择关系实体按钮,使用相同方法在实体图中定义一个新的关系实体,然后改名为RelationEntity。

首先需要明确的是,关系实体也是一个简单实体,这从生成的源代码中可以看出来。因为关系实体的父类是简单实体。从图中可以看出关系实体比简单实体多了一个Roles,这个Roles就是表示参与到当前关系的所有实体,在EMStudio的静态模型中这些参与进来的实体被称为角色(Role)。鼠标右击RelationEntity实体,在弹出菜单中选择Role,打开角色设计页。该界面的操作和之前介绍的成员设计页的操作基本一致的。点击Add按钮可以定义一个新的角色。

选中Entity属性,然后选择一个实体,表示哪一个实体参与到当前的关系中。角色的名字在同一个关系实体中必须是唯一的。并且,区别角色的唯一依据是角色名字而不是角色所表示的实体的类型。也就是说不同的角色表示的实体可以是相同的。生成源代码后读者可以看到RelationEntity类中有特定的属性来表示这些角色。EMLib有一组专门的操作允许开发者控制和使用角色。

四.组合实体
组合实体也是EMStudio静态模型扩展一个新的实体类型,这是UML标准中没有的。如果说关系实体是从独立实体层面组合一个实体,那么组合实体组合了不同实体的成员。同样的组合实体也是一个简单实体,这一点也可以从生成的源代码中得到验证。下面介绍组合实体的使用。在实体图工具条中选择组合实体按钮。

然后在实体图中定义一个新的组合实体。可以看出组合实体多了一个Elements组。组合实体除了自己可以定义成员外,还可以将其它实体的成员作为自己的成员。这些提供了成员给组合实体的实体称为元素(Element),它们会在Elements组中被显示出来。鼠标右击该实体,在弹出菜单中选择菜单条Property,打开实体设计器,将该实体改名为CombEntity,然后选择Element页。该界面的操作和之前介绍的成员设计页的操作基本一致的。点击Add按钮可以定义一个新的元素。

选择Entity属性可以设置当前元素对应于哪一个实体。与关系实体中的角色类似,在组合实体中唯一区分元素的是元素的名字,而不是元素表示实体的类型。也就是说不同的元素可以对应同一个类型的实体。选择Mapped Members属性,打开成员选择界面,将需要参与到组合实体中来的成员打钩就可以了。

点击OK按钮返回,关闭实体设计器,返回主界面,保存工程,然后生成代码。可以看到代码中有相关的属性来表示元素。从源代码层面看组合实体和关系实体非常类似,两者除了在静态模型中的概念语义上的差异以外,在EMLib的ORM操作中也存在差异。在使用EMLib执行实体的更新操作时,关系实体只会更新自身成员的值,角色实体的成员值是不会更新的。但是组合实体除了更新自身的成员以外,还会更新元素实体的成员。也就是说组合实体实际上一次可以更新多个实体的成员值。
Copyright 2014--2020 广联科技版权所有