JFinal 用 Postgresql 插入数据 ,获得 的自增主键 id 的值始终为1

红星xx 发布于 2013/09/12 16:19
阅读 2K+
收藏 0

JFinal 用 Postgresql 插入数据 ,获得 的自增主键 id 的值始终为1 

sql:

CREATE TABLE pre_bbs_reply
(
  create_uid integer,
  create_name character varying(25),
  create_time integer,
  create_ip character varying(15),
  content text,
  status smallint,
  id serial NOT NULL,
  CONSTRAINT reply_id PRIMARY KEY (id)
)
@JFinal      ,

代码 :

    ReplyModel reply = getModel(ReplyModel.class);
    reply.set("create_uid", 1);
    reply.set("create_name", "红星");
    reply.set("create_time", System.currentTimeMillis() / 1000);
    reply.set("create_ip", IpTableHelp.getIpAddress(getRequest()));
    reply.set("content", ParserHelp.dirtyHtml(getPara("content")));
    reply.set("status", 0);
    boolean statusReply = reply.save();
    if (statusReply != false) {
        System.out.println(reply);
        renderJson("id", reply.get("id"));
    }
    else {
        renderJson("msg", "数据写入失败,错误代码:reply");
    }           
System打印的值:

com.service.bbs.model.ReplyModel@b2176532 {id:1, content:11111, status:0, create_ip:127.0.0.1, create_name:红星, create_uid:1, create_time:1378972267}

数据都确实录入数据库了 ,没有错误 ,但多次插入的时候 用 get("id")  ,getInt("id"); 都始终为1 ; 获取不到变化的数值

加载中
0
玛雅牛
玛雅牛
CREATE TABLE pre_bbs_reply
(
  id serial NOT NULL,
  create_uid integer,
  create_name character varying(25),
  create_time integer,
  create_ip character varying(15),
  content text,
  status smallint,
  CONSTRAINT reply_id PRIMARY KEY (id)
)

把id放到第一个位置,再试一试,应该就好了。

0
JFinal
JFinal
  多次调用此 action,数据库插入了多少条数据? 注意检查一下,每次前端提交过来的的 id 值是否为 null。搞定后别忘了回来分享
0
红星xx
红星xx

引用来自“玛雅牛”的答案

CREATE TABLE pre_bbs_reply
(
  id serial NOT NULL,
  create_uid integer,
  create_name character varying(25),
  create_time integer,
  create_ip character varying(15),
  content text,
  status smallint,
  CONSTRAINT reply_id PRIMARY KEY (id)
)

把id放到第一个位置,再试一试,应该就好了。

震精了  ,可以成功获取了。 感谢 。 最佳答案奉上 ,表示这是 为什么呢?能否讲解一下 。
0
红星xx
红星xx

引用来自“JFinal”的答案

  多次调用此 action,数据库插入了多少条数据? 注意检查一下,每次前端提交过来的的 id 值是否为 null。搞定后别忘了回来分享

, 波总 没 认真看标题啊 。id 是 pgsql 的 自增ID  ,怎么会为空呢 ,都说了数据成功插入 。

感谢玛雅牛  ,将 id 主键 移到 表第一个 就 可以了 ,

0
宏哥
宏哥

引用来自“JFinal”的答案

  多次调用此 action,数据库插入了多少条数据? 注意检查一下,每次前端提交过来的的 id 值是否为 null。搞定后别忘了回来分享

$_sql = 'insert into '.self::quote_table($table_name,$db).'('.self::quote_column(array_keys($data),$db).') values ('.
                self::quote(array_values($data),$db).')'." returning ".self::quote_column($return_cols);

            $id = self::query(self::SELECT,$_sql,$as_object)->execute($db)->get($return_cols);

其实这个才是PG或者 Oracle的标准操作手法

这里 self::SELECT 是用来指定取回一个结果集. 

更高级的用法:

$_sql = 'insert into '.self::quote_table($table_name,$db).'('.self::quote_column($cols,$db).') values ';
        $_vsql = array();
        foreach ($values as $value){
            $_vsql[] = '('.self::quote($value,$db).')';
        }

        $_sql .= implode(',',$_vsql);

        $_sql .= ' returning '.self::quote_column($return_cols,$db);

        return self::query(self::SELECT,$_sql)->execute($db)->as_array();
通过一个sql 语句,插入多条

将ID以结果集形式返回.

MySQL是一个非常害人的东西





0
ajavaloser
ajavaloser

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

引用来自“JFinal”的答案

  多次调用此 action,数据库插入了多少条数据? 注意检查一下,每次前端提交过来的的 id 值是否为 null。搞定后别忘了回来分享

, 波总 没 认真看标题啊 。id 是 pgsql 的 自增ID  ,怎么会为空呢 ,都说了数据成功插入 。

感谢玛雅牛  ,将 id 主键 移到 表第一个 就 可以了 ,

把第一次增加的值给缓存了?
0
红星xx
红星xx

引用来自“宏哥”的答案

引用来自“JFinal”的答案

  多次调用此 action,数据库插入了多少条数据? 注意检查一下,每次前端提交过来的的 id 值是否为 null。搞定后别忘了回来分享

$_sql = 'insert into '.self::quote_table($table_name,$db).'('.self::quote_column(array_keys($data),$db).') values ('.
                self::quote(array_values($data),$db).')'." returning ".self::quote_column($return_cols);

            $id = self::query(self::SELECT,$_sql,$as_object)->execute($db)->get($return_cols);

其实这个才是PG或者 Oracle的标准操作手法

这里 self::SELECT 是用来指定取回一个结果集. 

更高级的用法:

$_sql = 'insert into '.self::quote_table($table_name,$db).'('.self::quote_column($cols,$db).') values ';
        $_vsql = array();
        foreach ($values as $value){
            $_vsql[] = '('.self::quote($value,$db).')';
        }

        $_sql .= implode(',',$_vsql);

        $_sql .= ' returning '.self::quote_column($return_cols,$db);

        return self::query(self::SELECT,$_sql)->execute($db)->as_array();
通过一个sql 语句,插入多条

将ID以结果集形式返回.

MySQL是一个非常害人的东西





jfinal 这个 获取主键确实 不好理解 ,插入按说只返回 受影响的 行数 。甚至没有返回  。都没返回 是怎么获取的主键值呢。
光石头
光石头
update 是返回影响行数,单条insert可以返回自增主键,这是jdbc规范,数据库基本都是支持的。
0
光石头
光石头
com.jfinal.plugin.activerecord.Model.getGeneratedKey(PreparedStatement, TableInfo) 的处理方式是直接获取第一个字段的值.也就是必须把id作为表的第一个字段!这写法......
0
JFinal
JFinal

引用来自“屁屁果”的答案

com.jfinal.plugin.activerecord.Model.getGeneratedKey(PreparedStatement, TableInfo) 的处理方式是直接获取第一个字段的值.也就是必须把id作为表的第一个字段!这写法......

要看 jfinal 源码就仔细点,要看懂,请勿对jfinal 使用者产生误导,如果还看不懂,告诉你要看如下这一句关键的:

ResultSet rs = pst.getGeneratedKeys();
if (rs.next()) {
  ....
}
你可以用 mysql 测试一下,无论你将 id 放在哪个位置都可以获取到,与位置半毛钱关没有
光石头
光石头
是sequece 不是自增列
JFinal
JFinal
回复 @屁屁果 : mysql、oracle、postgresql都测试过,没有问题
光石头
光石头
我是在线浏览了代码,没有测试,的确是我看的马虎了.不过这样写也是有问题的,能够使用sequence的不仅仅是oracle......
返回顶部
顶部