起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8791|回复: 2

概念使用Integer主键

  [复制链接]

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
发表于 2013-11-21 15:26:43 | 显示全部楼层 |阅读模式
有些数据表使用数据库的自增列作为主键,这种表如何定义为概念呢?

x5概念的主键是必须有默认值的,不能空着,等到保存到数据表里时,由数据库计算出新的主键值,因此不能使用数据库的自增列的能力了。
取而代之,使用x5提供的nextSeq函数作为概念的主键的默认值,在新增记录时,计算出新的主键值

概念的定义如下图,在主键默认值中使用nextSeq函数,nextSeq函数的参数可以使用概念名
QQ截图20131121153554.png

在映射设置中将主键的数据类型改为Integer
2.png

这样设置之后,就可以使用Integer的字段作为主键了。

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2013-11-21 15:49:52 | 显示全部楼层
上面的方法,有一个缺点,就是在新增记录时获取流水号,如果不保存记录,会导致数据表中的主键值不连续。
如果没有必须连续的要求,这样就可以,
如果要求必须连续,参考 新增数据时,数据库中产生连续不间断的序号
http://bbs.justep.com/forum.php?mod=viewthread&tid=50156

帖子中使用String类型的值作为序号,使用了方法 BizUtils.createNextSequenceString("CDRS"+date,"0000");   
我们这里要使用Integer类型的值作为序号,因此使用 BizUtils.getNextSequence(key); 方法,其中key不能和主键默认值里面的key一样

代码如下
  1.         public static void buyProcessBeforeSaveER_CGSQZBAction() {
  2.             //获得table参数
  3.             Table table = (Table)ContextHelper.getActionContext().getParameter("table");
  4.             //获得所有新增的行
  5.             Iterator<Row> rows = table.iterator(com.justep.system.data.ModifyState.NEW );   
  6.             while (rows.hasNext()){
  7.                 Row row = rows.next();  
  8.                 //产生新的序号,给主键赋值
  9.                 row.setValue("ER_CGSQZB",BizUtils.getNextSequence("ER_CGSQZB_real"));
  10.             }                     
  11.         }
复制代码
当然这样使用会造成界面上的主键值和刚存入数据库的主键值不同,如果不关闭页面,就立刻修改并且保存,会因为在数据表中找不到界面上的主键值而无法更新数据表,所以如果这样使用,必须在保存(saveData)之后执行刷新数据(refreshData)。
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

4

主题

16

帖子

166

积分

初级会员

Rank: 2

积分
166
发表于 2014-4-11 14:52:33 | 显示全部楼层
mark
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-11-25 02:54 , Processed in 0.058396 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表