在使用H2和PostgreSQL进行开发的grails 2.4.4上,当"显示"时,我看到了这种奇怪的行为。在域对象上调用脚手架控制器的动作,域对象具有"唯一的"约束其名称" property:执行了2个SQL select查询。
第一个查询按对象的ID加载对象,后续查询按其名称"加载对象。#/ p>
虽然这在保存对象时是有意义的(在保存之前检查唯一性,如this question中所述),但在#34; show"的情况下,我认为2个查询没有任何意义。行动。删除唯一约束时,仅执行一个查询。这是预期的行为,还是我做错了什么?
示例对象:
class Book {
String name
String author
static constraints = {
name(nullable: false, blank: false, unique: true)
}
}
控制器是脚手架,因此通常,show动作如下所示:
def show(Book bookInstance) {
respond bookInstance
}
2个记录的SQL查询(缩短)如下所示:
select ... from book book0_ where book0_.id=?
select ... from book this_ where this_.name=?
答案 0 :(得分:1)
show 操作的bookInstance
参数在此处被视为Command object,这意味着它在传递给操作之前已经过验证。因此,检查域类约束,并通过第二个查询验证name
字段的声明唯一性。
这里的检查确实没用,但是该机制用于将请求参数(id
除外)绑定到域类属性,验证是有意义的。
要阻止验证,请像这样实例化 Book 对象:
def show() {
Book bookInstance = Book.get(params.id)
respond bookInstance
}