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

发布于 2024-11-18 14:45:51 字数 349 浏览 2 评论 0原文

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

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

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

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

I am working on grails application. I must use H2 for development and Oracle for testing and production. I must use separate sequences for each domain class/table when using Oracle so I used the following in my domain classes:

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

But then I am not able to use H2. I get Unique index or primary key violation error when I try to create new using user interface.

What can be done to have such mapping to work only for production and testing environments and leave defaults for development? I use Grails 1.3.7.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

城歌 2024-11-25 14:45:52

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

    }
}

I had the same problem. You can also solve this by creating the sequences in h2 with environment-specific settings in your BootStrap.groovy file. In my case, I didn't have too many sequences that I needed to integration test and I didn't want to clutter up my domain classes with environment-specific coding. Here is my BootStrap. This worked fine for me:

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

    }
}
孤单情人 2024-11-25 14:45:52

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

import grails.util.Environment

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

You can embed logic inside the mapping block for cases like this:

import grails.util.Environment

class MyDomainClass {
   ...
   static mapping = {
      if (!Environment.isDevelopmentMode()) {
         id (generator:'sequence', params:[sequence:'SOME_SEQUENCE'])
      }
   }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文