在使用 H2 和 PostgreSQL 进行开发的 grails 2.4.4 上,当在域对象上调用脚手架 Controller 的“显示”操作时,我看到了这种奇怪的行为,该域对象的“名称”属性具有“唯一”约束:有执行了 2 个 SQL 选择查询。
第一个查询通过对象的 ID 加载对象,后续查询通过其“名称”加载对象。
虽然在保存对象时这是有意义的(在保存之前检查唯一性,如 this question 中所讨论的),但在“显示”操作的情况下,我认为这 2 个查询没有意义。当唯一约束被移除时,只执行一个查询。这是预期的行为,还是我做错了什么?
示例对象:
class Book {
String name
String author
static constraints = {
name(nullable: false, blank: false, unique: true)
}
}
Controller 是脚手架的,所以一般来说,show Action 如下所示:
def show(Book bookInstance) {
respond bookInstance
}
2 个记录的 SQL 查询(缩短)如下所示:
select ... from book book0_ where book0_.id=?
select ... from book this_ where this_.name=?
最佳答案
bookInstance
显示操作的参数被视为 Command object在这里,这意味着它在传递给操作之前正在被验证。因此检查域类约束和声明的 name
的唯一性。字段由第二个查询验证。
检查在这里真的没用,但该机制旨在将请求参数(id
除外)绑定(bind)到域类属性,其中验证是有意义的。
为了防止验证,像这样实例化 Book 对象:
def show() {
Book bookInstance = Book.get(params.id)
respond bookInstance
}
关于hibernate - Grails Controller "show"操作导致 2 个带有 "unique"约束的选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28087360/