Проблема генерации идентификатора в Grails при использовании Oracle и H2 для одного приложения - PullRequest
1 голос
/ 05 июля 2011

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 05 марта 2013

У меня была такая же проблема.Вы также можете решить эту проблему, создавая последовательности в 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")
            }
        }

    }
}
2 голосов
/ 05 июля 2011

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

import grails.util.Environment

class MyDomainClass {
   ...
   static mapping = {
      if (!Environment.isDevelopmentMode()) {
         id (generator:'sequence', params:[sequence:'SOME_SEQUENCE'])
      }
   }
}
...