您的位置:首页 > 数据库 > Oracle

用oracle的trigger生成主键的时候和hibernate冲突的讨论(转)

2012-06-15 14:44 435 查看
insert into table_name ... returning :id;

用Oracle特有的这个sql来插入数据,返回主键,让Hibernate知道主键的值,不过Hibernate目前并不能够支持这个sql语句,如果要让Hibernate支持这个sql,需要对源代码做相当大的改动。看看以后会不会加吧。

这个问题我不是第一次和别人讨论了,确实没有好的解决办法,除非对Hibernate进行大面积修改。但是话说回来,我用Oracle那么多年
了,从来都不使用trigger实现Auto
increment字段,我个人认为这种方式不好。本来Oracle已经把sequence从字段里面解放出来了,你还要在把它放回去。不用
trigger一样可以生成主键,看两个例子:

插入单条数据:

Java代码


insert table_name(id, name,...); values(sequ.nextval, ....);;

批量插入数据:

Java代码


insert table_name(id, name,...); select sequ.nextval, name,... from table2_name;

richart write:

这么做的话,最好是用一下nvl()函数(oracle自带),而且只能改动oracle相关的一个类。如果使用的是别的数据库,不知道有没有相似的问题存在?

robbin write:

oldma 写道
呵呵,谁能给解释一下?

看下面的PL/SQL:

Java代码


create trigger y before insert on bob

for each row

when (new.a is null);

begin

select x.nextval into :new.a from dual;

end;

用trigger来读sequence,插入表的主键字段,模拟SQL Server中的Auto Increment 字段

capitain write:

那oracle还有什么标准的办法实现Auto Increment 字段? 我们目前的程序插入的时候是按照auto increment字段来的, 就是不写id那个字段, 让数据库操作, 请问其他办法可以适用吗?

mikeho write:

是的,oracle是不必再写sp了,我们以前是在SQL server里面写了个sp来生成seq,没有用自增长,因为自增长在方法调用后返回id比较麻烦。现在都使用模拟UUID了(只有50位,理论上有重复建的危险,呵呵)。

作者:robbin 发表时间:2003-09-16
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: