Я пишу веб-приложение в 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;
/
Работает нормально.Спасибо Рэнди:)