用oracle的trigger生成主键的时候和hibernate冲突的讨论(转)
- insert into table_name ... returning :id;
用Oracle特有的这个sql来插入数据,返回主键,让Hibernate知道主键的值,不过Hibernate目前并不能够支持这个sql语句,如果要让Hibernate支持这个sql,需要对源代码做相当大的改动。看看以后会不会加吧。
这个问题我不是第一次和别人讨论了,确实没有好的解决办法,除非对Hibernate进行大面积修改。但是话说回来,我用Oracle那么多年
了,从来都不使用trigger实现Auto
increment字段,我个人认为这种方式不好。本来Oracle已经把sequence从字段里面解放出来了,你还要在把它放回去。不用
trigger一样可以生成主键,看两个例子:
插入单条数据:
- insert table_name(id, name,...); values(sequ.nextval, ....);;
批量插入数据:
- insert table_name(id, name,...); select sequ.nextval, name,... from table2_name;
richart write:
这么做的话,最好是用一下nvl()函数(oracle自带),而且只能改动oracle相关的一个类。如果使用的是别的数据库,不知道有没有相似的问题存在?
robbin write:
看下面的PL/SQL:
- 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