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

对同一应用程序使用Oracle和H2时Grails中的Id生成问题,oracle,grails,gorm,h2,sequences,Oracle,Grails,Gorm,H2,Sequences,我正在开发grails应用程序。我必须使用H2进行开发,使用Oracle进行测试和生产。在使用Oracle时,我必须为每个域类/表使用单独的序列,因此我在域类中使用了以下内容: static mapping = { id (generator:'sequence', params:[sequence:'SOME_SEQUENCE']) } 但是我不能使用H2。当我尝试使用用户界面创建新索引时,我得到了唯一索引或主键冲突错误 如何使这种映射只在生产和测试环境中工作,

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

    static mapping = {
       id (generator:'sequence', params:[sequence:'SOME_SEQUENCE'])
    }
但是我不能使用H2。当我尝试使用用户界面创建新索引时,我得到了唯一索引或主键冲突错误


如何使这种映射只在生产和测试环境中工作,并为开发保留默认值?我使用Grails1.3.7。

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

import grails.util.Environment

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

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

import grails.util.Environment

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

我也有同样的问题。您还可以通过在BootStrap.groovy文件中使用特定于环境的设置在h2中创建序列来解决这个问题。在我的例子中,我没有太多需要集成测试的序列,我也不想用特定于环境的编码把我的域类弄得乱七八糟。这是我的引导程序。这对我来说很好:

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")
            }
        }

    }
}

我也有同样的问题。您还可以通过在BootStrap.groovy文件中使用特定于环境的设置在h2中创建序列来解决这个问题。在我的例子中,我没有太多需要集成测试的序列,我也不想用特定于环境的编码把我的域类弄得乱七八糟。这是我的引导程序。这对我来说很好:

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")
            }
        }

    }
}

谢谢你的回答。我原以为应该有更好的方法来实现这一点,但提议的解决方案很有效,而且非常简单,我很惊讶我没有考虑它。谢谢你的回答。我原以为应该有更好的方法来做到这一点,但提议的解决方案很有效,而且非常简单,我很惊讶我没有考虑它。