ORMapping

栏目:eas cloud知识作者:金蝶来源:金蝶云社区发布:2024-09-22浏览:2

ORMapping

1. ORMapping 概念

ORM(对象关系映射,英语:Object Relational Mapping,简称ORM,或O/RM或O/R mapping)的实质就是将关系数据库中的业务数据用对象的形式表示出来,并通过面向对象的方式将这些对象组织起来,实现系统业务逻辑的过程。

在ORM过程中最重要的概念是映射(Mapping),通过这种映射可以使业务对象与数据库分离。从面向对象来说,数据库不应该和业务逻辑绑定到一起,ORM则起到这样的分离作用,使数据库层透明,开发人员真正的面向对象。

2. 为什么要使用ORM

    1.提高学习开发效率,降低开发成本

    使用ORM可以大大降低学习和开发成本。在实际的开发中,真正对客户有价值的是其独特的业务功能,而现在的现状是我们花费了大量的时间在编写数据访问,CRUD方法,包括后期的Bug查找,维护等也会花费相当多的时间在数据处理上,ORM框架已经把数据库转变成了大家熟悉的对象,开发人员将只需要了解面向对象开发就可以实现数据库应用程序的开发。

    2.简化代码,减少BUG数量

    通过建立ORM系统,能够大量减少程序开发代码,实现ORM后,开发数据层就比较简单,大大减少了出错机会。

    3.提高性能

同时通过Cache的实现,能够对性能进行调优,实现了ORM区隔了实际数据存储和业务层之间的关系,能够对每一层进行单独跟踪,增加了性能优化的可能。

    4.隔离数据源,可以很方便的转换数据库

利用ORM可以将业务层与数据存储隔开,开发人员不需要关系实际存储的方式,如果需要把SQL Server数据库换成ORACLE数据库,只需要切换数据中心就可,不需要修改程序。

3. ORMapping职责

    1. 将对象所持有的数据持久化到数据源中

    2. 按需从数据源中获取数据拼装成对象

    3. 屏蔽直接对数据源的操作,消除异构数据源对程序的影响

    4. 进行校验、计算、数据多语言等处理

4. ORMapping主要接口方法

    接口类:com.kingdee.bos.dao.ormapping.IORMappingDAO

    实现类:com.kingdee.bos.dao.ormapping.ORMappingDAO

    主要方法:

    1. 获取接口对象getInstance

    2. 获取业务对象getValue

    3. 获取业务对象集合getCollection

    4. 获取主键集合getPKList

    5. 获取满足条件的数据数目getCount

    6. 更新业务对象update

    7. 指定字段更新 updatePartial

    8. 批量更新 updateBatch

    9.  删除 delete

    10. 新增 addnew

    11. 验证是否满足条件(验权)accept

    12. 验证数据是否存在exists

5. ORMapping结构组成

ORMapping通过结合元数据,将业务层的数据转换成KSQL,再持久化到数据源中,将业务层与数据存储隔开。

ORMapping的基本处理行为-持久数据

持久数据逻辑关键类方法

ORMapping的基本处理行为-获取数据

获取数据逻辑关键类方法

com.kingdee.bos.dao.ormapping.innerGetCollection getValue/getCollection均会到该逻辑.

ObjectReader reader = reader();

ObjectReader. innerSelect -> EntityAccess.select方法根据entityObject,EntityViewInfo(包含selector,filter,sorter等)拼装出sql,并查询出结果集,用结果集构造Collection。

  

对于需要查询分录等详细信息时,在ObjectReader类中innerSetChildObject 方法,进一步构造分录的取数sql,并获取结果集,将结果集写入上层Collection中

  

6. ORMapping与外界交互方式

    ORMapping DAO对象的构成

    Context --- 上下文

    EntityObjectInfo --- DAO操作的根对象的元信息描述

    Connection --- 连接( DAO不负责连接释放、事务等与连接相关的处理)

    传入信息

    ObjectValue --- 值对象

    EntityViewInfo --- 包括Selector、Filter、Sorter、Top等信息,DAO根据这些信息来按需从数据源中获取数据以及填充对象;

        EntityViewInfo. getEntryFilters() ---分录过滤条件

        EntryWhere

        返回主对象及所有满足条件的子对象

        EntryALLWhere

        当所有子对象均满足条件时返回主对象

        EntryAnyWhere

        当任何一个子对象满足条件时返回主对象

        分录权限

        不实际进行分录过滤,将分录过滤条件转变形式,使之生成boolean型结果值,用于标记是否满足条件

        EntryFilter设置

        支持设置多级分录权限过滤条件

        调用权限服务

    OQL --- EntityViewInfo的文本化描述,可以与EntityViewInfo互相转换

    IObjectPK --- 值对象的主键,通常用于获取或更新记录

    输出信息

    ObjectValue --- 值对象

    ObjectValueCollection --- 值对象集合

7. ORMapping的处理策略

实体关系的映射

继承

实体属性继承

    baseEntity属性

    实继承

        父实体映射到具体的表

        两种方式:子类与父类共用一张表,子类使用扩展表

    虚继承

        父实体不映射到具体表

        一条继承链使用一张表

        由具体子类决定映射到哪张表


实体间关系继承

    当实体继承时,定义在实体上的关系也同时被继承


运行期实体关系

    实体间继承来的关系在运行期并非静态的,在一个完整的取数周期内实体关系可能被改变并暂存

关联

右对象不依赖左对象存在

    “不管有没有左对象,右对象都有可能存在”,如:订单-创建者

 

只负责持久化左对象

 

右对象按需装载

    查询时,如果不指定查询条件,默认查询出主实体的私有属性,关联实体只查一层

组合

右对象依赖左对象存在而存在

    “没有左对象,就没有右对象”,右对象没有单独存在的意义,如:某人-某人的手

 

左右对象拥有相同的生命周期,生死与共

 

负责持久化左对象,然后还要持久化右对象

    新增实体时,引擎会新增主实体,然后新增子实体

    更新实体时,引擎会更新主实体;然后更新子实体

 

装载时装载了左对象则右对象也随之装载

    查询时,如果不指定查询条件,默认查询出主实体的私有属性,和所有的子实体属性

销毁左对象,必须要销毁右对象

    删除实体时,引擎会删除所有的子实体,然后再删除主实体

 

组合关系处理

    从数据库中获取老的子实体集合

    比较新老子实体集合差异

    新增集合(新集合有,老集合无)

    删除集合(新集合无, 老集合有)

    更新集合(新集合有,老集合有)

多语言处理

元数据模型中定义(在solution中定义)

 

多语言信息标记在Table的Column中,实体属性不感知

 

列方式存储多语言信息

新增、修改、删除、查询处理策略

新增

对于组合的子实体根据依赖关系顺序新增(有可能首先新增主实体后增加组合子对象,也有可能先新增组合子对象后增加主实体,取决于组合关系的定义)

关联的子实体不负责新增

修改

首先更新主实体;

更新组合的子实体(Agent方式与普通方式)

删除

根据依赖关系从最底层组合子实体开始,逐层删除

查询

按需查询(EntityViewInfo)

默认策略为主实体装载所有自有属性、组合子对象;关联对象只装载一层,只装ID

 

8. ORMapping典型持久过程示例

类关系与物理模型关系

已知的条件:

Order类的实例;

Order、OrderEntry、User的实体元数据及关系的元数据Info实例;

持久化行为(新增、更新或删除)

目标:

将Order类实例所持有的数据,持久化到数据库中;

 

通过元数据生成的工厂类OrderFactory调用getRemoteInstance()(客户端)或getLocalInstance(ctx)(服务端)获取接口IOrder,然后调用addNew()方法新增OrderInfo;

OrderFactory. getRemoteInstance().addNew(orderInfo);

Step1:分析Order元数据

Step2: 构造EntityAccess对象

根据元信息对Order实例所携带的数据进行处理,包括计算、校验、多语言处理等

根据元信息得到的实体-数据库对象映射信息构建数据库表对象的Field与Value对;

构建后的EntityAccess自身具备持久化能力。

 

Step3: 构建SQL并执行

上一步中所得到的EntityAccess已经具备自描述的能力,使用工具类根据其自身的信息构建出SQL语句。


ORMapping.docx

ORMapping

1. ORMapping 概念ORM(对象关系映射,英语:Object Relational Mapping,简称ORM,或O/RM或O/R mapping)的实质就是将关系数据库中的...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息