但出现了一些问题。
基本系统是用java写的,但部分辅助还是用的delphi(C/S结构的),
在delphi写的部分包含大量记录生成,对并发基本无要求,
对速度要求很高,这个时候新记录的主键无法自动产生。
最后是所有delphi系统生成记录用的数据表的主键改用
自动增量了。
因为使用的数据库是oracle,采用的是sequence,相对
sqlserver的要灵活很多,要不是改动太大,很可能整个
项目的数据表都会改。
基本系统是用java写的,但部分辅助还是用的delphi(C/S结构的),
在delphi写的部分包含大量记录生成,对并发基本无要求,
对速度要求很高,这个时候新记录的主键无法自动产生。
最后是所有delphi系统生成记录用的数据表的主键改用
自动增量了。
因为使用的数据库是oracle,采用的是sequence,相对
sqlserver的要灵活很多,要不是改动太大,很可能整个
项目的数据表都会改。
这种方法很好,在实际的编程当中有很高的灵活性,数据库操作越繁杂这种方法体现的优点越明显,不过要请教一下怎么实现? 比如在DB2中select nextval form seq_1? 这样似乎不行啊!
而且这种方法在一种场合下无法使用:确保主键的连贯性。
Identity列能确保连贯,而且通过Statement.getGeneratedKeys()又能得到新增加的键值,这样也解决了主表-明细表插入的问题,因此选Identity列用作主键可谓是比较广泛的选择。
我个人觉得要用主键的话以上两种方法最可取,不过彼此都有一个互补的缺点:前者无法确保连贯;后者在导数据的时候要额外花点心思。
我现在的开发就遇到一种需要确保主键连贯的场合,无法使用第二种主键,而且也不知道如何使用简单的方法实现第一种方法中提到的Object ID,现在我的苯办法是通过select nextval for seq_1 from temp_table fetch first 1 rows only得到ID的! 希望不要被知道诀窍的人笑掉大牙哦!
这种方法不太好,如果有并发的话,容易重复。
hibernate中的uuid.hex如果类似GUID的话(本人不是很了解),以上问题其实并不难解决,可以用两种方法:
1。客户端生成GUID,用Delphi很容易的:
function GetGUID: String;
var
g : TGUID;
begin
Result:='';
if S_OK=CreateGuid(g) then
Result:=GUIDToString(g);
end;
2。Oracle生成,如:
insert into a_tab (id,name) values (sys_guid(), 'tom');
自己定制ID组件很方便,现成源码可见JPetstore中的Sequence类,一个类即可。
我插入一条记录,然后再插入一条名称,所属类别都相同的记录,系统不会出现异常, 而我不想让业务上完全相同的两条记录能够被重复插入,怎么办?
|
|
起码,当我保存一个Bean到数据库时,直接就可以返回系统生成的主键了,而不用再select一次,保存后返回主键很多地方是需要的,不是吗?
而且,好象这样也更灵活吧,比如我想实现分布式的主键,或者各表的键在整个数据库都唯一等等。
将hibernate组件独立出来是比较好的。
另外,序列号产生器从严格意义来说要求比较高,防止并发需要严格事务支持,还要设置不同的起点,这样减少序列号争夺,所以,序列号产生器组件最好使用现成第三方的。