我自己在GORM中的身份

rdm*_*ler 19 grails grails-orm

我试图改变grails中的标准'id':

calls Book {
  String id
  String title

  static mapping {
    id generator:'assigned'
  }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我很快发现这打破了我的自举.代替

new Book (id:'some ISBN', title:'great book').save(flush:true, failOnError:true)
Run Code Online (Sandbox Code Playgroud)

我不得不使用

def b = new Book(title:'great book')
b.id = 'some ISBN'
b.save(flush:true, failOnError:true)
Run Code Online (Sandbox Code Playgroud)

否则我会在调用save()'错误之前手动分配这个类的'ID.

但到目前为止还可以.

然后我在bookController的保存操作中遇到了同样的问题.但这一次,解决方法并没有成功.

有什么建议?

我知道,我可以重命名id,但之后我将不得不改变所有的脚手架视图......

Bur*_*ith 18

这是数据绑定的一个特征.你不想提交的数据能够改变像管理的字段idversion,让你使用的绑定所有可用的属性,除了这两个地图的构造函数(它也忽略任何值class,metaClass和其他一些).

所以这里有一点不匹配,因为这个值不是由Hibernate/GORM管理的,而是由你管理的.如您所见,解决方法是您需要分两步而不是一步创建对象.


Tod*_*odd 6

我无法复制这个问题(使用Grails 2.0.RC1).我认为它可能就像静态映射上缺少等号一样简单= {(你只是有静态映射{)

这是域对象的代码:

class Book {
    String id
    String name

    static mapping = {
        id generator:'assigned'               
    }
}
Run Code Online (Sandbox Code Playgroud)

在BootStrap.groovy里面:

def init = { servletContext ->
    new Book(name:"test",id:"123abc").save(failOnError:true)
}
Run Code Online (Sandbox Code Playgroud)

它对我来说很好.我认为id为123abc.