【问题标题】:Id generation problem in Grails when using Oracle and H2 for the same application将 Oracle 和 H2 用于同一应用程序时,Grails 中的 ID 生成问题
【发布时间】:2011-09-28 13:52:00
【问题描述】:

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

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

但是我无法使用 H2。当我尝试使用用户界面创建新时出现唯一索引或主键冲突错误。

如何使此类映射仅适用于生产和测试环境而保留默认值以供开发使用?我使用 Grails 1.3.7。

【问题讨论】:

    标签: oracle grails grails-orm h2 sequences


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。我希望应该有一些更好的方法来做到这一点,但建议的解决方案很有效,而且非常简单,我很惊讶我没有考虑过。
    【解决方案2】:

    我遇到了同样的问题。您还可以通过在您的 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")
                }
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-21
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      相关资源
      最近更新 更多