问题描述
代码如下:String sql="insert into article values(null,0,?,?,?,now(),0)"; conn=DB.getConn();conn.setAutoCommit(false);pstmt=DB.prepareStmt(conn, sql,Statement.RETURN_GENERATED_KEYS);pstmt.setInt(1, rootId);pstmt.setString(2, t.getTitle());pstmt.setString(3, t.getCont());pstmt.executeUpdate();ResultSet rsKeys=pstmt.getGeneratedKeys();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, //被回复帖子的IDrootid, //根帖ID 就是主题IDtitle,cont,pdate,isleaf大家看的懂吧??我想插入一条BBS根主题,那么他的rootid就应该是他自己的id,而id 又是auto_increment的。。这项目要用SSH框架整合的话,这问题怎么解决??? 问题补充:用Hibernate这样写可以吗??int id=Integer.parseInt(sessionFactory.getCurrentSession().save(t).toString());sessionFactory.getCurrentSession().createQuery("update from Theme t set t.rootid="+id+" where t.id="+id).executeUpdate();好像Session的save()方法返回的就是一个the generated identifier、、、??大家这样写过吗??
解决方案
这项目要用SSH框架整合的话,这问题怎么解决??? 一条搞不定 (可以写触发器 但麻烦)既然这样让rootid = 0 为根 不是更简单? 这样查主题贴就是rootid=0的
解决方案二:
sessionFactory.getCurrentSession().save(t);//这个时候t的id字段已经有值了,就是刚刚保存时产生的id值 所以后面直接通过t.getId()就能取到值了
解决方案三:
既然都可以判断是否是根贴了,那不设就是了。只是那列该不会有 not null 制约吧?而且后续的逻辑都要改,rootid=null时,使用id。这个主意,有待商榷...
解决方案四:
Statement.RETURN_GENERATED_KEYS这玩意在hibernate中是需要配置的,需要设置属性:hibernate.jdbc.use_get_generated_keys=true(默认为false)这样配置之后,就通过PreparedStatement.getGeneratedKeys()生成主键。你的这段语句,在hibernate中,首先按照上面配置,然后再通过po对象(即Article)获得这个id值,然后在根据id值写hql语句更新