在同一应用程序中使用Oracle和H2时,Grails中的Id生成问题

时间:2011-07-05 07:16:41

标签: oracle grails gorm h2 sequences

我正在处理grails应用程序。我必须使用H2进行开发,使用Oracle进行测试和生产。在使用Oracle时,我必须为每个域类/表使用单独的序列,因此我在我的域类中使用了以下内容:

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

但后来我无法使用H2。当我尝试使用用户界面创建新的时,我收到唯一索引或主键违规错误。

如何使这种映射仅适用于生产和测试环境并保留开发默认值?我使用Grails 1.3.7。

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题。您还可以通过在BootStrap.groovy文件中使用特定于环境的设置在h2中创建序列来解决此问题。在我的情况下,我没有太多的序列,我需要集成测试,我不想混淆我的域类与环境特定的编码。这是我的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")
            }
        }

    }
}

答案 1 :(得分:2)

对于以下情况,您可以在mapping块中嵌入逻辑:

import grails.util.Environment

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