Проблема генерации идентификатора в Grails при использовании Oracle и H2 для одного и того же приложения

Я работаю над приложением Grails. Я должен использовать H2 для разработки и Oracle для тестирования и производства. Я должен использовать отдельные последовательности для каждого класса/таблицы домена при использовании Oracle, поэтому я использовал следующее в своих классах домена:

    static mapping = {
       id (generator:'sequence', params:[sequence:'SOME_SEQUENCE'])
    }

Но тогда я не могу использовать H2. Я получаю сообщение об ошибке Нарушение уникального индекса или первичного ключа при попытке создать новый с помощью пользовательского интерфейса.

Что можно сделать, чтобы такое сопоставление работало только для производственных и тестовых сред, а значения по умолчанию оставались для разработки? Я использую Grails 1.3.7.


person Aidas    schedule 05.07.2011    source источник


Ответы (2)


Вы можете встроить логику в блок mapping для таких случаев:

import grails.util.Environment

class MyDomainClass {
   ...
   static mapping = {
      if (!Environment.isDevelopmentMode()) {
         id (generator:'sequence', params:[sequence:'SOME_SEQUENCE'])
      }
   }
}
person Burt Beckwith    schedule 05.07.2011
comment
Спасибо за ответ. Я ожидал, что должен быть какой-то более приятный способ сделать это, но предложенное решение работает и настолько просто, что я удивлен, что не подумал об этом. - person Aidas; 05.07.2011

У меня такая же проблема. Вы также можете решить эту проблему, создав последовательности в h2 с настройками для конкретной среды в файле BootStrap.groovy. В моем случае у меня не было слишком много последовательностей, которые мне нужны для интеграционного тестирования, и я не хотел загромождать свои доменные классы кодированием, специфичным для среды. Вот мой BootStrap. Это отлично сработало для меня:

import groovy.sql.Sql

class BootStrap {
    def dataSource
    def init = { servletContext ->

        environments {
            test {
                Sql sql = new Sql(dataSource)
                sql.execute("create sequence if not exists SOME_SEQUENCE")
            }
        }

    }
}
person Ed OConnor-Giles    schedule 05.03.2013