Grails Controller“show”动作导致2个具有“唯一”约束的选择查询

时间:2015-01-22 11:13:17

标签: hibernate grails gorm

在使用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=?

1 个答案:

答案 0 :(得分:1)

show 操作的bookInstance参数在此处被视为Command object,这意味着它在传递给操作之前已经过验证。因此,检查域类约束,并通过第二个查询验证name字段的声明唯一性。

这里的检查确实没用,但是该机制用于将请求参数(id除外)绑定到域类属性,验证是有意义的。

要阻止验证,请像这样实例化 Book 对象:

def show() {
    Book bookInstance = Book.get(params.id)
        respond bookInstance
}