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

  1. insert into table_name ...   returning :id;  



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

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

插入单条数据:

Java代码  收藏代码
  1. insert table_name(id, name,...); values(sequ.nextval, ....);;  



批量插入数据:

Java代码  收藏代码
  1. insert table_name(id, name,...);  select sequ.nextval, name,...  from table2_name;  



richart write:

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


robbin write:

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



看下面的PL/SQL:

Java代码  收藏代码
  1. create trigger y before insert on bob  
  2.   for each row  
  3.   when (new.a is null);  
  4.   begin  
  5.     select x.nextval into :new.a from dual;  
  6.   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

posted @ 2012-06-15 14:44  David_King  阅读(383)  评论(0编辑  收藏  举报