对象关系在模型中的实现案例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对象关系在模型中的实现案例
—基础软件部吴春云一、案例介绍:
在一个项目中,存在多个业务对象,各个业务对象间存在各种关系。从结构上来看,对象关系可以分为依赖、继承、关联、聚合、组合,从数量上来看,对象关系可以分为一对一、一对多、多对多。本案例主要介绍如何在开发中通过代码来表示对象间的各种关系,并基于这种关系进行前后端数据交互及持久化。
二、关系的概念及实现:
1.结构关系
1.1继承
继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。所以继承关系,确切的说是类与类之间的关系,但是对象又是类的实例,所以就这个角度理解为对象之间的关系,例如父与子的关系,动物与狗的关系,汽车与大众的关系等。
工作流结构部分的实体类:SysNode(环节)、SysTransactNode (办理环节)、SysActivityNode(活动环节)、SysDecisionNode(决策环节)应用了这种继承关系,使得子类拥有了父类环节中的属性,但子类本身代码大大简化,结构清晰。
public class SysTransactNode extends SysNode{}
public class SysActivityNode extends SysTransactNode{}
public class SysDecisionNode extends SysTransactNode{}
1.2依赖
依赖就是一个对象A使用到了另一个对象B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是对象B的变化会影响到对象A。比如某人要过河,需要借用一条船,此时某人与一条船之间的关系就是依赖。表现在代码层面,一般指由局部变量、返回值建立的对于其他对象的调用关系,如对象B作为参数被对象A在某个方法中使用。
1.3关联
关联体现的是两个类之间语义级别的一种强依赖关系,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。关联可以是单向、双向的。表现在代码层面,为被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。
1.4聚合
聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,为多个整体对象共享,比如计算机与CPU、公司与员工的关系等。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
1.5组合
组合也是关联关系的一种特例,它体现的是一种contains-a的
关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,比如人和人的大脑。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
2.数量关系
2.1一对一
一个人对应一个身份证号,一个身份证号对应一个人;通过身份证号能找到具体的人,通过具体的人也能得到身份证号,不会重复。这里人和身份证号的关系就是一对一关系。
2.2一对多(多对一)
一个班级有多个学生,但是这个班级只有一个班主任。在这个班级中随便找一个人,就会知道他们的班主任是谁;知道了这个班主任就会知道有哪几个学生。这里班主任和学生的关系就是一对多,学生和班主任的关系是多对一关系。
2.3多对多
一个班级有多个学生,他们有语文课、数学课、英语课等多门课。一门课有多个人上,一个人可以上多门课。这里学生和课程的关系就是多对多关系。
3.关系的实现
基础平台中,权限规则与基本规则是一对一的关系,字典与字典项是一对多的关系,下面分别介绍如何在数据库层面、服务层面、Javascript层面来表示这两种关系。
3.1数据库层面:
数据库中业务对象对应为表或视图,对象关系对应为各表间的关联关系,具体可抽象为外键等和外部关联的字段。
a.一对一
在数据库中,建立权限规则表与基本规则表,在权限规则表中通过基本规则ID字段对应基本规则表的主键ID,以此种方式表示权限规则与基本规则的一对一关系。同样,可以在基本规则表中增加一个字段对应权限规则表的主键ID来建立一对一关联。可以根据实际业务需求来选择在哪方设置外键。
b.一对多
在数据库中,建立字典主表与字典从表,在字典从表中通过主表
字典ID字段对应字典主表的主键ID,以此种方式表示字典与字典项的一对多关系。需要注意的是,在一对多的关系配置中,关系的维护方只能是多方,即只能在多方设置外键,这是与一对一关系不同的地方。
另外可以通过中间表的方式来表示一对多关系,如模块与功能权限,如下图所示:
在中间表中,通过模块ID、功能权限ID分别引用模块表、功能权限表的主键ID表示这种一对多关系。
3.2服务层面:
Java中业务对象对应为实体,对象关系对应为实体间的映射,在有了能够表示对象关系的表结构后,可以根据表结构设计java实体类,使用ORM框架配置实体类间的关系。下面使用Hibernate框架演示如何配置一对一、一对多关系。
a.一对一
public class SysAuthRule {
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "GL_RULE_ID", referencedColumnName = "ID")
private SysBaseRule sysBaseRule;
}
上述代码在权限规则实体类中引用基本规则类型的属性,体现了