如何獲得剛纔新增的Id---hibernate--java--j2ee--[完美方法]

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

win2003server,sqlsrever2000

[email protected] 

  經常碰到這種情況:

   主表新增時,同時要插入明細表.Id必須獲得剛纔新增的Id.
以前試驗過Sql的SELECT IDENT_CURRENT('物理表名') AS MYId 來單獨寫個方法

(注意session)獲得Id.也有人直接在hbernate的save方法手工(MaxId()+1)指定Id而不要其自動設定.但我覺得多有不妥.沒想到其實很簡單,赫赫.

看個例子:

[本文作者: [email protected]]
    
             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幫助

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章