Обработка столбцов auto inc в Oracle с помощью Slick

Я использую пятно 2.1.0. У Oracle нет понятия автоматического приращения для столбца, так как я могу управлять вставкой с помощью последовательности с помощью последовательности. например, у меня есть таблица и последовательность следующим образом:

    СОЗДАТЬ ТАБЛИЦУ ПОЛЬЗОВАТЕЛЯ
    (    "USER_ID" NUMBER НЕ NULL ENABLE,
         "NAME" VARCHAR2(100) НЕ ОБУЧАЕТСЯ,
         "АДРЕС" VARCHAR2(1000) НЕ ОБУЧАЕТСЯ);
    CREATE SEQUENCE USER_ID_SEQ  MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 2;

Как я могу использовать эту последовательность для установки моего USER_ID?
Кроме того, установка autoIncLastAsOption = true в SourceCodeGenerator Slicks, похоже, не помогает. Мои идентификаторы все еще не являются опцией [].

1 ответ

Вот некоторые варианты, предлагаемые Typesafe Developer:

  1. Если вы не против позволить Slick управлять DDL, вы можете использовать O.AutoInc с OracleDriver. Он автоматически создаст последовательность поддержки для сгенерированных значений идентичности. Это работает путем установки триггера, который автоматически заполняет идентификатор из последовательности. Вот код, который Slick генерирует для столбца AutoInc в Oracle:

    создать последовательность $seq start с 1 приращением на 1;
    создать или заменить триггер $trg перед вставкой на $tab, ссылаясь на новый как новый для каждой строки, когда (new.$col is null) начинает выбирать $seq.nextval into:new.$col from sys.dual;
    конец;
    где $seq, $trg, $col и $tab - это имена последовательности, триггера, столбца идентификаторов и таблицы.
    Во время фактической операции вставки не выполняется специальный код. Поэтому, если у вас уже есть схема базы данных с последовательностью идентификаторов, вы можете вручную создать триггер, как показано выше, и пометить столбец как O.AutoInc в Slick, чтобы получить стандартную обработку для автоматически увеличивающихся столбцов.

  2. Если вы хотите решение без триггера, вы можете insertExpr для вставки в слик. Это позволяет вычислять выражения, например, используя собственный API последовательности Slick (который поддерживается OracleDriver), но в отличие от обычной вставки вы не получаете все функции, удобство и производительность (например, пакетные вставки и предварительно скомпилированные вставки). Недостатком является то, что это не может быть предварительно скомпилировано (но компиляция простого выражения из нескольких скалярных значений должна быть относительно дешевой), и вы не можете просто вставить отображаемый класс в таком случае без какой-либо дополнительной схемы отображения.

  3. Другой вариант - сначала получить новый идентификатор (или даже несколько идентификаторов для пакетной вставки) из последовательности одним запросом, поместить их в объекты передачи данных, а затем вставить их, как правило, с идентификаторами на месте. Для этого требуется один дополнительный запрос на пакет (для первой выборки идентификаторов), но вы можете легко использовать сопоставленные объекты и предварительно скомпилировать все.

Другие вопросы по тегам