我正在使用grails 2.2.2并且我创建了一个具有一个唯一String属性的域类:
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 (?, ?)
这里的谜团是两个选择查询而不是一个。我发现here的一个查询的原因是,选择查询是为了检查唯一性。为什么第二次选择会发生?
答案 0 :(得分:1)
毕竟,我找不到两个选择查询的逻辑解释。我发现最好的是在没有手动更改数据库的情况下摆脱这两个选择,如here所述。
因此,为了摆脱这些选择,有人应该首先以不同的方式设置域类(没有约束,但是使用映射)。
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 (?, ?)