如何获得刚才新增的Id---hibernate--java--j2ee--[完美方法]

环境:eclipse3.2 +tomcat5.5.17  +struts2.0.6

win2003server,sqlsrever2000

iuprg@tom.com 

  经常碰到这种情况:

   主表新增时,同时要插入明细表.Id必须获得刚才新增的Id.
以前试验过Sql的SELECT IDENT_CURRENT('物理表名') AS MYId 来单独写个方法

(注意session)获得Id.也有人直接在hbernate的save方法手工(MaxId()+1)指定Id而不要其自动设定.但我觉得多有不妥.没想到其实很简单,赫赫.

看个例子:

[本文作者: drs163@163.com]
    
             HbSession.TransactionBegin();//开始hibernate事务
              //新增主表,其Id是identity的
             TSwMyrec curMyrec= new TSwMyrec();
              curMyrec.setCDate(c.getTime());
             
curMyrec.setCName(CName);
              curMyrec.setCUrl(CUrl);
              ...
              _curMyrecImpl.SaveNewcurMyrec(curMyrec);//保存主表
              //_curMyrecImpl---是接口,封装了数据操作的方法
              //保存明细表

            ...    

                //明细表里,是个复合Id  ,MasterId必须指向主表Id           
                nDetailId =Integer.valueOf(strType[i]);
                
                TComputeId  NewComputeId = new TComputeId();
              
                NewComputeId .setMasterId(curMyrec.getId()); //注意,此处即能获得curMyrec刚才新增的Id.

              //这时,hibernate已经自动设定了一个待新增的Id(也可能是从sqlserver返回的,还请知道的朋友告诉我一下:))

                
                NewComputeId .setCDetailId(nDetailId );//人为设定的第二个Id,实际中也可能是Identity.或者其他情况.
               

                 NewDetailRec.setId(NewComputeId );


                _curMyrecImpl.saveNewDetailRec(NewDetailRec); //保存明细表
              }
           
           
           HbSession.TransactionCommit();//事务提交
 

==========================================

注意:

在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函数类似。

@@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。

IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回任何会话和任何作用域中为特定表生成的标识值.

参见T_SQL帮助

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安优小青和他的程序生活

我的文档对您有很大的帮助吗?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值