【问题标题】:Even id values. Tricky sequence mapping (grails oracle)甚至 id 值。棘手的序列映射(grails oracle)
【发布时间】:2011-12-19 13:42:05
【问题描述】:

我正在用 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 一样使用身份密钥生成策略。有人可以和我分享一些意见吗?


编辑(解决方案):根据 Randy 的回答,在触发器中添加一个条件就足够了,如下所示:

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; 
/

工作正常。谢谢兰迪:)

【问题讨论】:

  • 首先是判断序列值中的'gap'是否可以容忍。只要它们保持独特,它们就应该没问题。第二个是确定在每次插入时获取额外 id 的开销是否是一个问题 - 我怀疑它会是。

标签: oracle grails grails-orm


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2011-05-09
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多