hibernate - Grails Controller "show"操作导致 2 个带有 "unique"约束的选择查询

标签 hibernate grails grails-orm

在使用 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/

相关文章:

grails - 如何在 Ubuntu 中将 Grails 版本从 2.1.2 升级到 2.2.3

java - Grails - 使用 java 域类使用 GORM 创建 grails 域类

chalice GORM : how to access id of super class

java - 获取 org.hibernate.MappingException : No Dialect mapping for JDBC type:

java - Hibernate 子查询问题

java - 在 hql 中使用 select * 但获取值的地址

hibernate - 在 Grails 中 HQL 插入查询

select - Grails f:字段显示选定下拉菜单

objective-c - GNUstep/Objective-c 和 nib 文件

java - Hibernate 在创建后立即加载对象