对同一应用程序使用Oracle和H2时Grails中的Id生成问题
我正在开发grails应用程序。我必须使用H2进行开发,使用Oracle进行测试和生产。在使用Oracle时,我必须为每个域类/表使用单独的序列,因此我在域类中使用了以下内容:对同一应用程序使用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。当我尝试使用用户界面创建新索引时,我得到了唯一索引或主键冲突错误 如何使这种映射只在生产和测试环境中工作,
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")
}
}
}
}
谢谢你的回答。我原以为应该有更好的方法来实现这一点,但提议的解决方案很有效,而且非常简单,我很惊讶我没有考虑它。谢谢你的回答。我原以为应该有更好的方法来做到这一点,但提议的解决方案很有效,而且非常简单,我很惊讶我没有考虑它。