3

我正在使用 grails 2.2.2,并且创建了一个具有唯一字符串属性的域类:

class Myclass {
    String dscr // my String attibute

    static constraints = {
        dscr unique: true // the code to set it unique
    }
}

然后我运行 grails 控制台命令来测试这个简单的类,使用以下代码和 loggingSql = true 来查看结果查询:

def a = new Myclass([dscr:'dscr1'])
a.save()

结果查询如下:

Hibernate: select this_.id as id0_0_, this_.version as version0_0_, this_.dscr as dscr0_0_ from myclass this_ where this_.dscr=?
Hibernate: select this_.id as id0_0_, this_.version as version0_0_, this_.dscr as dscr0_0_ from myclass this_ where this_.dscr=?
Hibernate: insert into myclass (version, dscr) values (?, ?)

这里的奥秘在于两个选择查询而不是一个。正如我在这里发现的那样,一个查询的原因是选择查询是为了检查唯一性。为什么会发生第二次选择?

4

1 回答 1

1

毕竟,我找不到两个选择查询的合乎逻辑的解释。我发现最好的方法是在不手动更改数据库的情况下摆脱这两个选择,如此处所述

所以要摆脱这些选择,首先应该以不同的方式设置域类(没有约束,但有映射)。

class Myclass {
    String dscr

    static mapping = {
        dscr unique: true
    }
}

然后为了保护您的代码免受异常影响,因为现在 hibernate 不检查唯一性,您应该像这样插入新元素:

try {
    def a = new Myclass([dscr:'dscr1'])
    a.save()
} catch(e) {
    Myclass.withSession { session ->
        session.clear()
    }

    // do whatever you want to handle a possible exception
}

现在生成的查询只是一个导入查询,它可能运行成功也可能不运行。

Hibernate: insert into myclass (version, dscr) values (?, ?)
于 2013-08-30T08:49:16.943 回答