如果重命名 id 列,Grails 数据将不会绑定(bind)

标签 grails

Grails 将自动从域类创建一个 id 和一个版本列。我想使用我自己的列作为主键。所以,我按照文档更改映射。

class book {
    String isbn
    static mapping = {
        id generator: 'assigned', name: 'isbn'
    }
}
到现在为止还挺好。 isbn 列现在是主键。
我使用 generate-all 创建 View 和 Controller 。但是,数据绑定(bind)将不再起作用。
创建和保存工作没问题。它将一本书绑定(bind)到 View 。我可以在数据库中添加一本新书没问题。
def create() {
   respond new Book(params)
}

def save(Book book) {
   if (book == null) {
      notFound()
      return
   }
   ...
}
但更新操作不绑定(bind)。在我单击编辑 View 中的更新按钮后,书为空。
def update(Book book) {
   if (book == null) {
      notFound()
      return
   }
   ...
}
在 Save 和 Update Action 中 generate-all 生成的代码是一样的。我不明白为什么它将书绑定(bind)到保存操作而不是更新操作。
你能告诉我这个问题吗?
非常感谢!

最佳答案

我想我想通了。当我将对象绑定(bind)到 View 时,Grails 被硬编码以查找 编号 属性(property)。它必须拼写为“id”。如果域类中没有“id”属性,Grails 将不会绑定(bind)。
我解决这个问题的方法是查看服务器生成的实际 HTML。
如果有一个 id 属性绑定(bind)到 View ,我看到 HTML 有 ../ Controller / Action /id 关联。
如果缺少 id 属性,则 HTML 链接只是 ../ Controller /索引
我是 Grails 的新手。所以,我想为了让绑定(bind)工作,我需要一个 id 属性供 Grails 放入链接。
我认为这是一个 REST 调用。我不知道 REST 是什么。
因此,我将尝试在我的 Book 域类中添加一个虚拟 id 属性,以查看 Grails 是否会上钩。我将设置域,以便 Grails 不会在数据库表中生成 id 列。 id 属性仅在本地使用。无需将其保存到数据库中。

class book {
    String isbn
    String id
    static mapping = {
        id generator: 'assigned', name: 'isbn'
    }
}
我将 isbn 值复制到 id 属性。我不确定这是否可行。我希望 Grails 将在 View 中使用 id 属性中的 isbn 字符串而不是默认的整数 id 值生成链接。
../ Controller / Action /978-3-16-148410-0

关于如果重命名 id 列,Grails 数据将不会绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64458991/

相关文章:

grails - 使用 Assets 管道插件在 grails 中管理连接的 js 和 css Assets

grails - 使用URL映射使URL转换失败

grails - Grails中的Set属性方法无法全局更改实例

performance - 我可以使用 Grails session 来存储整个域对象吗?

jquery - 如何通过remoteFunction传递g:datePicker值?

grails - 如何在GRAILS JWT中发送其他参数

tomcat - CloudFoundry 上的 Grails 应用程序不会重新启动

spring - 线程 “main”中的异常java.lang.NoSuchMethodError:org.springframework.core.ResolvableType

Grails 脚手架 404 与 byte[]

grails - 如何通过 createCriteria 中的 desc 进行订单?