我们在客户业务系统开发中,经常会遇到一些单据信息量很大(字段很多),由于关系数据库的表中一行最多只能存储8000个字符,这样经常会导致我们通过一个实体(通常是一个实体一张表)无法解决,需要再另外新建一个实体,和当前实体(以后称为主实体)进行关联,在单据的编辑界面自己编码代码进行绑定。这样做有主要以下2点不足。
1、要手动编写代码,工作量大
2、由于是2个实体,在保存时分别为2个单独的事务,容易造成主实体外的单据保存多条的情况
在hibernate中,可以通过级联的关联方式配置来实现这种需求,同时支持1对1和1对多(即EAS中的单据头和分录的关系)。
由于在EAS BOS中,组合关系无法实体1对1的关系,但是BOS中提供了一种扩展表的方式,一个实体中的属性,可以指定映射到扩展表中字段,从而实现把一个有很多属性的实体(比如超过200个属性)对应到多张数据表上。操作步骤如下:
1、使用BIM创建好一个业务单据,并字段字段,如下图
2、使用BOS,新增一张扩展表,并定义要映射过来和字段
![](http://hi.csdn.net/attachment/201203/1/0_1330594067G8F5.gif)
3、打开实体对应的数据表,指定关联的扩展表
4、打开实体,重新指定属性,关联到扩展表上
![](http://hi.csdn.net/attachment/201203/1/0_1330594077LTAB.gif)
5、发布业务单据和新建的扩展表,并在数据库中创建扩展表(注:通过BIM发布业务单元在同步数据库步骤不会创建扩展表)
6、启动开发环境,使用上面新建的业务单据新增数据进行测试,数据可以正在存取。
![](http://hi.csdn.net/attachment/201203/1/0_1330594167666o.gif)
在验证过程中,发现扩展表的实现有2个问题
2、如果一个实体关联2张或多张扩展表,在Query元数据中如果同时引用了2个扩展表的属性,生成的SQL只关联第1个属性对应的扩展表,对应其它扩展表的属性都被解析为对应第1张扩展表,从而导致生成 的SQL无法执行。
1、要手动编写代码,工作量大
2、由于是2个实体,在保存时分别为2个单独的事务,容易造成主实体外的单据保存多条的情况
在hibernate中,可以通过级联的关联方式配置来实现这种需求,同时支持1对1和1对多(即EAS中的单据头和分录的关系)。
由于在EAS BOS中,组合关系无法实体1对1的关系,但是BOS中提供了一种扩展表的方式,一个实体中的属性,可以指定映射到扩展表中字段,从而实现把一个有很多属性的实体(比如超过200个属性)对应到多张数据表上。操作步骤如下:
1、使用BIM创建好一个业务单据,并字段字段,如下图
![](http://hi.csdn.net/attachment/201203/1/0_1330594063dKb2.gif)
2、使用BOS,新增一张扩展表,并定义要映射过来和字段
![](http://hi.csdn.net/attachment/201203/1/0_1330594067G8F5.gif)
3、打开实体对应的数据表,指定关联的扩展表
4、打开实体,重新指定属性,关联到扩展表上
![](http://hi.csdn.net/attachment/201203/1/0_1330594077LTAB.gif)
5、发布业务单据和新建的扩展表,并在数据库中创建扩展表(注:通过BIM发布业务单元在同步数据库步骤不会创建扩展表)
6、启动开发环境,使用上面新建的业务单据新增数据进行测试,数据可以正在存取。
![](http://hi.csdn.net/attachment/201203/1/0_1330594167666o.gif)
如果要正常运行上面的例子,需要修改好下面的问题2,可以使用我提供的补丁包和进行验证。希望金蝶研发能够尽快发补丁解决下面的2个问题。
补丁包下载路径:http://download.csdn.net/detail/yjshang/4103919
在验证过程中,发现扩展表的实现有2个问题
1、在实体的取值实现中,对扩展表别名设置有Bug,最终导致在打开单据时,因为取值的SQL错误报中断。EditUI在加载实体属性时,要根据生成的SQL从数据取数,实体对应表及各关联属性对应的表,设置别名,如果有多个扩展表属性,由于代码错误,会出现每个对应扩展表字段的属性都对应一个数据表的别名,这样就从第2个对应扩展表字段的属性都对应了一个不存在的表别名,从而导致出现中断。
代码错误在实现类com.kingdee.bos.dao.ormapping.impl.SQLGeneratorImpl中。
2、如果一个实体关联2张或多张扩展表,在Query元数据中如果同时引用了2个扩展表的属性,生成的SQL只关联第1个属性对应的扩展表,对应其它扩展表的属性都被解析为对应第1张扩展表,从而导致生成 的SQL无法执行。