环境: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而不要其自动设定.但我觉得多有不妥.没想到其实很简单,赫赫.
看个例子:
[本文作者: 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帮助