Grails Controller "show" 操作导致 2 select 具有 "unique" 约束的查询

Grails Controller "show" action causing 2 select queries with a "unique" constraint

在使用 H2 和 PostgreSQL 进行开发的 grails 2.4.4 上,当在域对象上调用脚手架控制器的 "show" 操作时,我看到了这种奇怪的行为,它有一个 "unique" 对其 "name" 属性 的约束:执行了 2 SQL select 查询。

第一个查询通过对象的 ID 加载对象,后续查询通过其 "name".

加载对象

虽然这在保存对象时有意义(在保存之前检查唯一性,如 this question 中所讨论),但我认为在 "show" 操作的情况下这两个查询没有任何意义.当去除唯一约束时,只执行一个查询。这是预期的行为,还是我做错了什么?

示例对象:

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=?

show动作的bookInstance参数在这里被当成Command object,意思是在传递给动作之前正在验证.因此检查域 class 约束并由第二个查询验证 name 字段声明的唯一性。

检查在这里真的没用,但该机制旨在将请求参数(id 除外)绑定到域 class 属性,其中验证有意义。

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

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