开发者社区> 问答> 正文

Jfinal向数据库插入2次值的时候,第二次会报错,问题出现在自增id上面?报错

@JFinal  你好,想请教个问题

问题描述如下:

使用JFinal插入值

public void suggestion() {
		Suggestion.suggestionDao.set("userId", getPara("userId"));
		Suggestion.suggestionDao.set("suggestion", getPara("suggestion"));
		Suggestion.suggestionDao.set("uploadTime", new Date());
		boolean flag = Suggestion.suggestionDao.save();
		writeJson(flag, null);
	}

数据库表结构如下:

  id(integer  自增id)问题就出在这个自增id上,  userId,  suggestion, uploadTime.

第一次的时候使用上面的suggestion() 方法能够成功的向数据库中插入值。  如下所示:

 

{userId=-1, suggestion=8, uploadTime=Thu Aug 15 17:53:59 CST 2013}

Controller  : com.szfore.ideaddpass.controll.SuggestionController.(SuggestionController.java:1)
Method      : suggestion
Parameter   : userId=-1  suggestion=8 
--------------------------------------------------------------------------------
Sql: insert into `suggestion`(`userId`, `suggestion`, `uploadTime`) values(?, ?, ?) 

注意最后一句SQL,数据库总共四个字段,id是自增id不需要传值。上面是正常执行的。

当我第二次执行的时候,问题出现了。原因很简单,如下  注意SQL,自增id居然出现在里面了,经过调试的时候发现id的值,竟然是第一次插入时候返回的id,这样在执行插入操作就会报  主键重复的错误。为什么会这样呢??

JFinal action report -------- 2013-08-15 17:54:49 ------------------------------
Controller  : com.szfore.ideaddpass.controll.SuggestionController.(SuggestionController.java:1)
Method      : suggestion
Parameter   : userId=-1  suggestion=8 
--------------------------------------------------------------------------------
Sql: insert into `suggestion`(`id`, `userId`, `suggestion`, `uploadTime`) values(?, ?, ?, ?)

/**
	 * Save model.
	 */
	public boolean save() {
		TableInfo tableInfo = tableInfoMapping.getTableInfo(getClass());
		
		StringBuilder sql = new StringBuilder();
		List<Object> paras = new ArrayList<Object>();
		DbKit.dialect.forModelSave(tableInfo, attrs, sql, paras);

问题的就是上面代码最后一句,第二个参数attrs,它里面包含了自增id,最终导致了上面的错误。为什么上一次的插入后返回的id会存在attrs里面呢?   请遇到有此问题的帮忙看看。

展开
收起
爱吃鱼的程序员 2020-06-22 17:30:53 646 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    手册5.3章节下面一排大红字说的很清楚了,数据承载的需要new一个新对象,类似于dao用法的都不能用于数据承载,只能用于查询,你搜一下论坛吧!资料挺多的。

      楼上回答完全正确,Model中的dao对象是全局共享的,不能承载数据,JFinal手册有红色字标出来了。

      JFinal手册才38页,但大家都不去看,情何以堪啊,看来JFinal手册不能再继续加东西了

    引用来自“红星xx”的答案

    手册5.3章节下面一排大红字说的很清楚了,数据承载的需要new一个新对象,类似于dao用法的都不能用于数据承载,只能用于查询,你搜一下论坛吧!资料挺多的。

    引用来自“JFinal”的答案

      楼上回答完全正确,Model中的dao对象是全局共享的,不能承载数据,JFinal手册有红色字标出来了。

      JFinal手册才38页,但大家都不去看,情何以堪啊,看来JFinal手册不能再继续加东西了

    引用来自“szkiti”的答案

    引用来自“JFinal”的答案

      楼上回答完全正确,Model中的dao对象是全局共享的,不能承载数据,JFinal手册有红色字标出来了。

      JFinal手册才38页,但大家都不去看,情何以堪啊,看来JFinal手册不能再继续加东西了

    2020-06-22 17:31:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载
云时代的数据库技术趋势 立即下载
超大型金融机构国产数据库全面迁移成功实践 立即下载