2011-07-05 18 views
1

我正在使用grails应用程序。我必须使用H2进行开发,使用Oracle进行测试和生产。在同一个应用程序中使用Oracle和H2时,Grails中的Id生成问题

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

但后来我不能够使用H2:当使用甲骨文,所以我用我的领域类下面,我必须使用单独的序列,每个域类/表。我得到唯一索引或主键违规错误,当我尝试创建新的使用用户界面。

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

回答

2

您可以嵌入逻辑mapping块内像这样的情况:

import grails.util.Environment 

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

感谢您的答案。我希望应该有一些更好的方法来做到这一点,但提出的解决方案的工作原理非常简单,我很惊讶,我没有想过。 – Aidas

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

    } 
} 
相关问题