我正在用 grails 编写一个 webapp,并且第一次在下面使用 oracle。每个表都有从序列生成的 id,我在插入之前使用触发器设置 id,如下所示:

CREATE TABLE  "RECIPE"  
   (    "ID" NUMBER(19,0) NOT NULL ENABLE,  
    ... 
     PRIMARY KEY ("ID") ENABLE 
   ) 
/ 
 
 CREATE SEQUENCE   "RECIPE_SEQ"  MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE 
/ 
 
CREATE OR REPLACE TRIGGER  "BI_RECIPE"  
  before insert on "RECIPE"                
  for each row   
begin    
    select "RECIPE_SEQ".nextval into :NEW.ID from dual;  
end;  
/ 

我也做了映射
static mapping = { 
        table 'RECIPE' 
        version false         
        id column:'ID', generator:'sequence', params:[sequence:'RECIPE_SEQ'] 
        ... 
} 

现在在插入域对象期间,它始终具有偶数 id 值。我发现生成偶数 id 是因为 grails 从序列中获取了一个 id 值,然后在真正插入到 db 触发器期间再次从序列中获取一个 id 值并覆盖 grails 给定的值。

怎么办?对我来说最好的解决方案是 oracle 像 mysql 一样使用身份 key 生成策略。有人可以和我分享一些意见吗?

编辑(解决方案) :根据兰迪的回答,在触发器中添加一个条件就足够了,如下所示:
CREATE OR REPLACE TRIGGER  "BI_RECIPE"  
  before insert on "RECIPE"                
  for each row   
begin 
    if :NEW.ID IS NULL then 
        select "RECIPE_SEQ".nextval into :NEW.ID from dual;  
    end if; 
end;  
/ 

工作正常。谢谢兰迪:)

请您参考如下方法:

有时您可能会使用检查 :new.id 是否为空的策略。

如果为空,则使用序列,如果不为空,则使用提供的值。

唯一性约束将防止实际错误。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!