JDBC里的return_generated_keys问题,在SSH整合框架中怎么解决??

代码如下:
String sql="insert into article values([color=darkred]null,0,?,?,?,now(),0[/color])";
conn=DB.getConn();
conn.setAutoCommit(false);
[color=darkred] [b]pstmt=DB.prepareStmt(conn, sql,Statement.RETURN_GENERATED_KEYS);[/b][/color]
pstmt.setInt(1, rootId);
pstmt.setString(2, t.getTitle());
pstmt.setString(3, t.getCont());
pstmt.executeUpdate();

    ResultSet rsKeys=[color=darkred]pstmt.getGeneratedKeys()[/color];
    if(rsKeys.next()){
        rootId=rsKeys.getInt(1);
    }

    stmt=DB.createStmt(conn);
    stmt.executeUpdate("update article set rootid="+rootId+" where id="+rootId);
    conn.commit();

注:这是一个BBS项目,数据库article表:
id auto_increment,
pid, //被回复帖子的ID
rootid, //根帖ID 就是主题ID
title,
cont,
pdate,
isleaf
大家看的懂吧??我想插入一条BBS根主题,那么他的rootid就应该是他自己的id,而id 又是auto_increment的。。这项目要用SSH框架整合的话,这问题怎么解决???

4个回答

这项目要用SSH框架整合的话,这问题怎么解决??? 一条搞不定 (可以写触发器 但麻烦)

既然这样让rootid = 0 为根 不是更简单? 这样查主题贴就是rootid=0的

jinnianshilongnian
jinnianshilongnian 如果是0的话 就无需检查 主题贴的rootid就是0 其他的是非0
大约 7 年之前 回复
wangcl412
wangcl412 我这里pid=0的是主题帖。触发器的话,那就是检查pid=0,再让rootid=id,但是这里id怎么取呢??
大约 7 年之前 回复

Statement.RETURN_GENERATED_KEYS这玩意在hibernate中是需要配置的,需要设置属性:
hibernate.jdbc.use_get_generated_keys=true(默认为false)
这样配置之后,就通过PreparedStatement.getGeneratedKeys()生成主键。

你的这段语句,在hibernate中,首先按照上面配置,然后再通过po对象(即Article)获得这个id值,然后在根据id值写hql语句更新

既然都可以判断是否是根贴了,那不设就是了。

只是那列该不会有 not null 制约吧?
而且后续的逻辑都要改,rootid=null时,使用id。

这个主意,有待商榷...

j_clxy
clxy大叔 可以不用 is null。 比如需要查询某个id的所有帖子会是 rooid = ? or id = ? 这样既可。两列肯定都是索引。 但无论如何,效率变低了。
大约 7 年之前 回复
jinnianshilongnian
jinnianshilongnian is null 等是不走索引的 小心使用
大约 7 年之前 回复

sessionFactory.getCurrentSession().save(t);
//这个时候t的id字段已经有值了,就是刚刚保存时产生的id值
所以后面直接通过t.getId()就能取到值了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问