元数据培训
提高开发效率,使开发人员能在自己熟悉的应用领域发挥更多的作用,减少技术上的纠缠。
关于MDA更多信息:可以google “MDA”,”MOF”,”JMI”等进行了解
什么是模型驱动
模型驱动的NC开发流程
从前 现在
1. 使用模型设计器设计业务模型 2. 生成java代码 3. 生成数据模型 4. 生成单据模板、查询模板.. 5. 定制业务流程
从实例开始学习-业务接口
业务接口: 1) 枚举类型必须设置返回值类型,当前支持int和String两种 2) 枚举类型不对应java类,枚举类型的fullClassName为其返回类型,及int或者String
从实例开始学习-业务接口实现类
业务接口实现类的优先级: 1) 实体和特定业务接口连线上的实现类 2) 实体上注册的实现类 3) 业务接口上注册的实现类 4) 根据映射关系生成的实现类
从实例开始学习-创建实体
创建实体要点: 1)主键:实体必须设置主属性(主键) 2)访问器:当组件代码样式选则传统样式时,针对主子表或者多字表中主表对应的实体, 访问器要设置为AggVO,即聚合VO访问器,其他的一律选择NCVO,访问器的作用在 于适配模型与java代码的不一致性。 3)动态信息修改类:用于动态修改实体,比如运行时增加或者设置某些属性active=false 4)缺省表名:生成数据库时对应的表名 5)业务接口实现类: 如果实体实现了业务接口,这里可以注册实现类,后面统一讲解
元数据编程接口-元数据查询
nc.md.MDQueryService 后台查询,前台请不要调用 前台全部使用MDBaseQueryFacade,否则会导致严重后果,后果自负,如果 MDBaseQueryFacade的查询方法不全,可以通知cch添加. MDQueryService服务为元数据自身查询服务的统一入口,通过此入口类可以 请求不同的查询服务,在后台,如果是一些简单查询,比如通过名称,则优先使 用nc.md.MDBaseQueryFacade提供的查询方法
从实例开始学习-制作单据模板
从实例开始学习-制作单据模板
元数据编程接口-元数据查询
元数据编程接口-元数据查询
MDBaseQueryFacade提供元数据基本的一些查询,如查询模块、组件、实体、值对象、 属性等,前后台均可调用。 支持前台缓存功能,有效减少远程调用。 前台缓存能很好的解决元数据加载的效率问题,但是如果开发人员在开发环境需要频 繁的修改元数据,则必须重启JStarter才能使得修改生效,为避免此问题,可以在JStarter的启动 参数里增加参数,在开发时临时关闭前台缓存功能。-Dnc.md.detectEachTime=true
什么是模型驱动
MDA的意义
1. 变化是永恒的,技术永远在革新, 实现技术的变化要快于业务领域的 变化。 2. 对建模的投资更加持久有效,不绑 定在具体的技术上 3. 从模型出发,而非从代码出发,产品 更加人性化,更能贴近用户需求 4. 有利于建立规范的开发流程,改善代 码质量,更加OO
关于MDA的争议还是比较多的,MDA也是有一定的使用场景的,NC的元数据借鉴了MDA的思想, 但更加注重NC的现状,注重实效,尽可能提高NC产品的整合力度,减少开发人员的重复、琐碎劳动,
实例层次使用业务接口:
Customer cust = new Customer(); cust.setPrimaryKey("pkaaaaaaaaaaa"); cust.setCode("code001"); cust.setName("nameadfafdafasd"); NCObject custbasObj = CObject.newInstance(cust); ICodeName codename = custbasObj.getBizInterface(nc.vo.bd.customer.ICodeName.class); System.out.println(codename.getCode()); System.out.println(codename.getName());
举例:
实体: 部门、客商 值对象:颜色、金额、地址
从实例开始学习
从实例开始学习-创建组件
点击中间画布空白区域,设置组件信息: 1)版本号:记录组件当前版本,防止旧版本覆盖新版本 2)代码风格:主要针对主子表及多子表结构,传统样式生成AGGVO,标准样式为OO 3)多语言资源模块:对应以前多语言里的文件夹名,现在按照组件划分 4)主实体: 一个组件里如果有实体,必须设置主实体 5)名称:必须全局唯一 6)目录和模块没有关系,目录只是为了更好的组织管理bmf文件
从实例开始学习-实体的属性
实体的属性设置:
1)对于设置为AggVO样式的实体,请检查字表属性(1-n聚合关系),比如上图中的[订单明细],访问 策略要设置为BodyOfAggVOAccessor 2)类型样式:主要分Single,REF,ARRAY,LIST,具体可参考《元数据开发红皮书》 3)类型:可以自行选择,当建立实体间关系时,也会自动设置;主键一定要设置为UFID类型 4)字段名称:生成数据库表列的名称
从实例开始学习-业务接口的使用
模型层次使用业务接口:
Map<String, IAttribute> nc.md.model.IBusinessEntity.getBizInterfaceMapInfo(String fullIntefaceClassName) 查询实现了特定业务接口的实体中的属性和接口方法的对应关系, 如果客户实现了ICodeName<<编码名称接口>>, 则customerBean.getBizInterfaceMapInfo(“nc.vo.bd.ICodeName”) 将返回 <”code”,CodeAttr>, <”name”,NameAttr>,<”displayName”,displayNameAttr>
3.实体是指需要有唯一标识的业务对象,NC原有的大部分VO基本上都算得上是实体
NC元数据相关概念
实体与值对象的区别 区别1:
实体在整个应用系统中,需要有唯一的标识(主键),而值对象不需要, 两个实体只有在主键相等时才相等,而值对象只有全部属性相等便可 以认为是相等的。
区别2:
从对象的生命周期来看,实体对象是可以被跟踪和控制的,而值对象的 生命周期只是在它使用的一刻
NCObject
//得到订单的元数据 IBean bean = MDBaseQueryFacade.getInstance().getBeanByFullClassName("订单类名"); //创建查询session QuerySession session =QuerySessionFactory.createQuerySession(bean); //增加条件 session.addCondition( Restrictions.and(Restrictions.eq("订货人.编码","0002"),Restrictions.eq("邮寄地址.邮政编码", "100090"))); //增加待查询字段 session.addPath(new String[]{"账单地址.详细地址", "账单地址.邮编"}); //返回行结果集 Collection res = DASFacade.queryPrimaryKeyByCriteriaReturnRowSet(session); 返 回 的 结 果 为 Collection, 内 部 为 hashmap , 每 一 个 hashmap 代 表 一 行 记 录 , 可 以 通 过 : map.get("账单地址.详细地址") 取得 "账单地址.详细地址"
NC-UAP 模型驱动开发
用友软件股份有限公司 程操红 2008年 5 月 20 日
什么是模型驱动 NC元数据相关概念 从实例开始学习
认识模型设计器 创建组件、实体、关系、枚举、业务接口 生成java代码 生成数据模型(表结构/ORMAP信息) 注册服务并发布 制作单据模板
元数据编程接口
元数据查询 基于元数据的数据访问 基于元数据的持久化
从实例开始学习-枚举类型来自枚举类型: 1) 枚举类型必须设置返回值类型,当前支持int和String两种 2) 枚举类型不对应java类,枚举类型的fullClassName为其返回类型,及int或者String 3) 可以为属性设置类型为枚举类型 4) 通过IAttribute.getDataType()便可以得到IType,如果为枚举类型,则可转型为 IEnumType, 通过IEnumType. getEnumValues()得到枚举类型列表。
从实例开始学习-实体的属性
实体的属性设置:
1) 计算属性:由其他属性计算得到,本身不需要保存到数据库,不会生成数据库的列 2) 空:是否可以为空 3) 授权:用于权限控制 4) 扩展标签: 可以自由的给属性加上标注,比如@uniqueCheck,在程序中便可以通过这个标签 来过滤属性。 List<IAttribute> nc.md.model.impl.MDBean.getAttributes(String tag)
从实例开始学习-生成JAVA代码
导出JAVA代码 1) 可以在组件里设置代码风格,对于主子表结构,V55基本上选择AggVO,这样生成 的代码和以前的兼容。 2) 必须启动NC中间件 3) 导出java文件前,必须确保最新修改的组件已经被发布 4) 生成的代码都实现了SuperVO
从实例开始学习-生成数据模型
从实例开始学习-发布元数据
发布元数据 1) 必须保存后才能发布 2) 发布时必须启动NC中间件,因为元数据会发布到数据库中,数据库为默认数据源 3) 发布时会一起发布被依赖的组件,支持双向依赖,循环依赖 4) 如果发布元数据时忽略版本,则完全以本地的模型文件,可能造成库中新版本的模 型被覆盖,非特殊情况不推荐使用。 5) 开发环境的发布只是为了开发人员测试需要,提交产品时只需要将bmf文件提交到 相应模块的METADATA目录下,安装帐套时会自行发布到数据库中