Issue 主题
希望业务实体框架持久化映射支持自定义
详细描述
我要反馈
[x] 缺陷
[ ] 新特性
目前业务实体框架提供了基于关系型数据库的持久化处理,支持CRUD等操作,目前支持业务实体字段与数据库列一对一、根据业务字段类型多对一、根据关联结构一对多等映射关系。
随着UBML用户越来越多,发现了越来越多的复杂的映射场景,框架目前的结构设计很难将全部场景都包起来:本身投入的资源就不够,并且会使得框架越来越臃肿。
目前已经识别的场景有如下:
1、对于组织字典,在很多业务单据上都会引用,一般都是采取的业务单据上存组织内码(ID),通过关联设置带出其名称、编码等其他信息的方式。在很多企业中,对于业务单据上,组织名称的显示,会有统一的要求:有的企业只显示组织名称(xx部门)、有的企业显示组织的简称(xx)、有的企业显示组织的全称(xx集团/xx公司/xx部门)等。这就要求组织业务实体上名称字段对应的数据库列是一个动态的(可能是基于一套全局的配置);
2、复杂类型字段存储:对于一些复杂类型的字段(有多个属性),要求将这些属性保存到不同的数据库列中,如:属性1保存到列x中,属性2保存到列y中,属性3保存到列z中,在CRUD、过滤、排序等场景中,都需要做字段值的拆分、组合、过滤等映射。
解决此问题的思路,一般情况下,使用微内核机制,框架只负责整体逻辑,将实体字段持久化映射逻辑视为一种处理插件,框架内置的这几种场景都是特定内置的插件,如果框架内置的场景不支持,可自己开发相应的插件。要支持插件化扩展的功能点包括但不限于查询(查询列、查询关联表、数据库值转换为内存对象字段值的映射、过滤条件的映射、排序条件映射)、检索(检索列、检索关联表、数据库值转换为内存对象中字段值的映射)、新增保存(insert列、内存对象到数据库值的映射)、编辑修改(update列、内存对象到数据库值的映射)等,都需要支持插件化扩展。
@张进(浪潮国际) @王茂健 hi,John、Michael:
此Issue,需要在设计时,将持久化层与数据库交互相关的内容提取出来,持久化框架不能再有sql拼接、数据转换等具体的逻辑,需要将这些处理逻辑使用扩展机制注入进来。
建议在进行设计之前,提前了解微内核架构,梳理清楚几个点:
1、哪些逻辑属于框架;
2、哪些逻辑属于扩展内容;
3、扩展机制该以何种方式实现,基于配置?异或bean?
4、框架需要提供给扩展逻辑哪些内容(这一点可以以关联、业务字段、组织等场景进行梳理),要保持接口的扩展性,后续如果需要框架提供更多内容时,不用调整接口,比如整一个context?
5、解析型与生成型要复用此逻辑,生成型需要考虑之前生成的代码如何兼容;
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
从用户反馈来看,查询、检索两个取数的场景对于定制化的需求比较旺盛,由于目前持久化层逻辑封闭,不能提供细粒度的扩展机制,当内置处理逻辑不满足用户需求时,只能全部重写查询逻辑,代价较大且实现较为复杂、繁琐。针对更新保存的场景,可以通过联动计算,对数据进行分解指定,基本满足用户使用。本次重构着重支持取数的扩展。
有以下几点工作需要处理:
1.持久化层将取数逻辑进行抽取封装,以内置插件的形式集成到框架中,框架根据实体插件配置信息决定使用内置插件还是扩展插件,并将插件处理结果进行组装。
2.取数逻辑可以分解成查询字段拼接、表名拼接、过滤条件拼接、排序条件拼接、数据转换五个部分,我们需要对五个部分都支持插件扩展。框架负责定义各个部分的插件接口,约定返回数据格式,规则,确保自定义插件的返回结构符合框架整体处理逻辑。
3.考虑增加一个扩展配置表,允许用户通过界面,配置对查询哪个部分进行插件替换。
4.我们除了对持久化层支持插件进行重构外,也需要对内置查询的功能进行增强,比如字段取数增加对表达式设置、变量上下文的支持,过滤条件支持Exists等。尽量通过内置功能来满足用户需求,减少二次开发。
经讨论评审,确定在元数据字段上增加扩展属性标记表名扩展、字段扩展和数据转换扩展实现。
元数据存储结构如下:
1.表名拼接的扩展实现中,需要在扩展实现中指定关联字段信息,并且存储到框架指定的结构中,以便后续拼接字段的时候能够识别到,整体结构如下:
2.字段拼接的扩展实现中,框架会传递变量、上下文等信息,供扩展获取指定的参数,以便完成字段拼接,运行结构如下:
3.数据转换的扩展实现中,框架会传递当前扩展字段以及关联字段信息和映射关系,并提供公共的数据转换接口,以便完成复杂对象的处理,框架也要进行修改,允许BE字段类型和实际类型不一致,比如文本类型对应值是关联对象,整体结构如下:
登录 后才可以发表评论