Четные значения идентификатора. Сложное отображение последовательности (Grails Oracle) - PullRequest
1 голос
/ 19 декабря 2011

Я пишу веб-приложение в Grails, и впервые с оракулом внизу.Каждая таблица имеет идентификатор, сгенерированный из последовательности, и я устанавливаю идентификатор с помощью триггера перед вставкой, как показано ниже:

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.Я обнаружил, что четные идентификаторы создаются, потому что grails получает значение id из последовательности, а затем во время реальной вставки в триггер db снова получает значение id из последовательности и переопределяет значения, заданные grails.

И что делатьс этим?Лучшим решением для меня будет оракул, работающий как mysql со стратегией генерации идентификационных ключей.Кто-нибудь может поделиться со мной своим мнением?


РЕДАКТИРОВАТЬ (решение) : Согласно ответу Рэнди, достаточно добавить условие в триггер, как показано ниже:

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

Работает нормально.Спасибо Рэнди:)

1 Ответ

4 голосов
/ 19 декабря 2011

иногда вы можете использовать стратегию проверки, если: new.id имеет значение null.

если оно равно нулю, используйте последовательность, если оно не равно нулю, то используйте предоставленное значение.

ограничение уникальности предотвратит фактические ошибки.

...