環境:eclipse3.2 +tomcat5.5.17 +struts2.0.6
win2003server,sqlsrever2000
經常碰到這種情況:
主表新增時,同時要插入明細表.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幫助