您好,欢迎来到划驼旅游。
搜索
您的当前位置:首页对象关系在模型中的实现案例

对象关系在模型中的实现案例

来源:划驼旅游
对象关系在模型中的实现案例

—基础软件部 吴春云

一、案例介绍:

在一个项目中,存在多个业务对象,各个业务对象间存在各种关系。从结构上来看,对象关系可以分为依赖、继承、关联、聚合、组合,从数量上来看,对象关系可以分为一对一、一对多、多对多。本案例主要介绍如何在开发中通过代码来表示对象间的各种关系,并基于这种关系进行前后端数据交互及持久化。

二、关系的概念及实现:

1.结构关系 继承

继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。所以继承关系,确切的说是类与类之间的关系,但是对象又是类的实例,所以就这个角度理解为对象之间的关系,例如父与子的关系,动物与狗的关系,汽车与大众的关系等。

工作流结构部分的实体类:SysNode(环节)、SysTransactNode(办理环节)、SysActivityNode(活动环节)、SysDecisionNode(决策环节)应用了这种继承关系,使得子类拥有了父类环节中的属性,但子类本身代码大大简化,结构清晰。

public class SysTransactNode extends SysNode{}

public class SysActivityNode extends SysTransactNode{} public class SysDecisionNode extends SysTransactNode{}

依赖

依赖就是一个对象A使用到了另一个对象B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是对象B的变化会影响到对象A。比如某人要过河,需要借用一条船,此时某人与一条船之间的关系就是依赖。表现在代码层面,一般指由局部变量、返回值建立的对于其他对象的调用关系,如对象B作为参数被对象A在某个方法中使用。 关联

关联体现的是两个类之间语义级别的一种强依赖关系,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。关联可以是单向、双向的。表现在代码层面,为被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。 聚合

聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,为多个整体对象共享,比如计算机与CPU、公司与员工的关系等。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。 组合

组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,比如人和人的大脑。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。 2.数量关系 一对一

一个人对应一个身份证号,一个身份证号对应一个人;通过身份证号能找到具体的人,通过具体的人也能得到身份证号,不会重复。这里人和身份证号的关系就是一对一关系。 一对多(多对一)

一个班级有多个学生,但是这个班级只有一个班主任。在这个班级中随便找一个人,就会知道他们的班主任是谁;知道了这个班主任就会知道有哪几个学生。这里班主任和学生的关系就是一对多,学生和班主任的关系是多对一关系。 多对多

一个班级有多个学生,他们有语文课、数学课、英语课等多门课。一门课有多个人上,一个人可以上多门课。这里学生和课程的关系就是多对多关系。 3.关系的实现

基础平台中,权限规则与基本规则是一对一的关系,字典与字典项是一对多的关系,下面分别介绍如何在数据库层面、服务层面、

Javascript层面来表示这两种关系。 数据库层面:

数据库中业务对象对应为表或视图,对象关系对应为各表间的关联关系,具体可抽象为外键等和外部关联的字段。 a.一对一

在数据库中,建立权限规则表与基本规则表,在权限规则表中通过基本规则ID字段对应基本规则表的主键ID,以此种方式表示权限规则与基本规则的一对一关系。同样,可以在基本规则表中增加一个字段对应权限规则表的主键ID来建立一对一关联。可以根据实际业务需求来选择在哪方设置外键。 b.一对多

在数据库中,建立字典主表与字典从表,在字典从表中通过主表字典ID字段对应字典主表的主键ID,以此种方式表示字典与字典项的一对多关系。需要注意的是,在一对多的关系配置中,关系的维护方只能是多方,即只能在多方设置外键,这是与一对一关系不同的地方。

另外可以通过中间表的方式来表示一对多关系,如模块与功能权限,如下图所示:

在中间表中,通过模块ID、功能权限ID分别引用模块表、功能权限表的主键ID表示这种一对多关系。 服务层面:

Java中业务对象对应为实体,对象关系对应为实体间的映射, 在有了能够表示对象关系的表结构后,可以根据表结构设计java实体类,使用ORM框架配置实体类间的关系。下面使用Hibernate框架演示如何配置一对一、一对多关系。 a.一对一

public class SysAuthRule { @OneToOne(cascade =

@JoinColumn(name = \"GL_RULE_ID\", referencedColumnName = \"ID\")

private SysBaseRule sysBaseRule; }

上述代码在权限规则实体类中引用基本规则类型的属性,体现了上文所描述的关联关系,@OneToOne注解表示权限规则与基本规则是一对一的关系,@JoinColumn注解表示在权限规则表中通过GL_RULE_ID字段对应基本规则表的主键。 b.一对多

public class SysDict { @OneToMany(cascade =

@JoinColumn(name = \"DICT_ID\", referencedColumnName = \"ID\") private List sysSubDictList; }

上述代码在主字典实体类中使用list集合封装从字典类型的属性,体现了上文所描述的组合关系,@OneToMany注解表示字典与字典项是一对多的关系,@JoinColumn注解表示在字典从表中通过DICT_ID字段对应字典主表的主键。

通过使用Hibernate框架进行配置后,在java类间的建立起相应的关系,并与数据库中表之间的关系相对应,使得前端业务数据按照对象关系生成sql语句得以执行。 层面:

基于后端表结构、实体类设计,前端js借助Backbone的Model概念,通过配置Model间关系relations实现Model间的一对一、一对多关系,Js中Model对象就相当于java中的实体类。同时,引入

数据模型列表Collection的概念,作为一对多Model的载体。 前端数据模型框架关系结构见下图:

a.一对一

var ModelRule = ({ . });

var ModelAuthRule = ({ . relations: [ 对多

ModelSubDict = ({ . } }); var SubCollection = model: ModelSubDict . relations: [

依据请求sql,查询数据结果集,映射进实体DataBase层面由实体生成sql,发由数据库执行,生成持久化数据服务层面数据model回传统一格式数据,加载进实体中实体按照关联关系生成统一格式数据,返回前端Js层面据库和服务层之间的交互:

获取数据:依据由Hibernate生成的sql请求,从数据库查询数据,将结果集提返回并封装到具体的实体对象中。

存储数据:服务层通过Hibernate,将业务数据按照对象关系生成执行sql语句,数据库执行sql,形成持久化数据。 层和前端之间的交互:

提供数据供前端渲染:前端根据需要发起ajax请求服务层,服务层依据请求,将与业务相关的实体数据序列化为json字符串,提供给前端,前端将json字符串反序列化为Js对象数据,供Model渲染展示。

将前端数据传回服务层处理:前端将对象数据序列化为json数据发送服务层,通过SpringMVC将序列化数据直接映射进实体中,或解析序列化数据,依据对象关系载入实体中。服务层依据相关业务活动实现的代码逻辑,处理业务。

四、基于对象关系的思考:

以上介绍了对象间有哪些关系,这些对象关系在代码中如何实现,以及基于对象关系的前后端数据交互过程,基于对象间关系来组织前端、服务层、数据库三层的数据结构,借鉴了前端的Backbone框架思想、后端SpringMVC、Hibernate框架技术,同时约定前后端数据传输格式为json格式,这些都将有助于提高代码的质量及开发的效率。

因此,为了能够在开发中应用对象关系,需要在业务分析建模阶段多关注业务对象间的关系,在明确业务对象间关系后进行开发。在设计阶段针对业务对象、对象关系和业务活动设计合适的数据库层、服务层、前端对象及对象关系。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo6.com 版权所有 湘ICP备2023023988号-11

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务