gpt4 book ai didi

hibernate - 插入前进行两次选择查询而不是一次

转载 作者:行者123 更新时间:2023-12-03 05:35:19 26 4
gpt4 key购买 nike

我正在使用 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 ,是进行选择查询来检查唯一性。为什么会发生第二次选择?

最佳答案

毕竟,我找不到这两个选择查询的逻辑解释。我发现最好的方法是摆脱这两个选择,而无需手动更改数据库,如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 (?, ?)

关于hibernate - 插入前进行两次选择查询而不是一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18510402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com