有些数据表使用数据库的自增列作为主键,这种表如何定义为概念呢?

Wex5概念的主键是必须有默认值的,不能空着,等到保存到数据表里时,由数据库计算出新的主键值,因此不能使用数据库的自增列的能力了。

取而代之,使用x5提供的nextSeq函数作为概念的主键的默认值,在新增记录时,计算出新的主键值

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


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

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

上面的方法,有一个缺点,就是在新增记录时获取流水号,如果不保存记录,会导致数据表中的主键值不连续。

如果没有必须连续的要求,这样就可以。

如果要求必须连续,参考 新增数据时,数据库中产生连续不间断的序号
http://bbs.justep.com/forum.php?mod=viewthread&tid=50156

帖子中使用String类型的值作为序号,使用了方法 BizUtils.createNextSequenceString(“CDRS”+date,”0000”);

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

代码如下

	public static void buyProcessBeforeSaveER_CGSQZBAction() {
	//获得table参数
	Table table = (Table)ContextHelper.getActionContext().getParameter("table");
	//获得所有新增的行
	Iterator<Row> rows = table.iterator(com.justep.system.data.ModifyState.NEW );
	while (rows.hasNext()){
	Row row = rows.next();
	//产生新的序号,给主键赋值
	row.setValue("ER_CGSQZB",BizUtils.getNextSequence("ER_CGSQZB_real"));
	}
	}

当然这样使用会造成界面上的主键值和刚存入数据库的主键值不同,如果不关闭页面,就立刻修改并且保存,会因为在数据表中找不到界面上的主键值而无法更新数据表,所以如果这样使用,必须在保存(saveData)之后执行刷新数据(refreshData)。

本文由WeX5君整理,WeX5一款开源免费的html5开发工具H5 App开发就用WeX5!

阅读其他app 开发相关文章:http://doc.wex5.com/?p=3443