我自己在GORM中的身份

时间:2011-10-27 17:05:27

标签: grails gorm

我尝试更改grails中的标准'id':

calls Book {
  String id
  String title

  static mapping {
    id generator:'assigned'
  }
}

不幸的是,我很快发现这打破了我的自举。而不是

new Book (id:'some ISBN', title:'great book').save(flush:true, failOnError:true)

我必须使用

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

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

但到目前为止还可以。

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

有什么建议吗?

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

3 个答案:

答案 0 :(得分:18)

这是数据绑定的一个特性。您不希望提交的数据能够更改idversion等托管字段,因此您使用的Map构造函数会绑定除这两个之外的所有可用属性(它也会忽略任何值) classmetaClass和其他几个人。)

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

答案 1 :(得分:6)

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

以下是域对象的代码:

class Book {
    String id
    String name

    static mapping = {
        id generator:'assigned'               
    }
}

在BootStrap.groovy内:

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

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

答案 2 :(得分:0)

您需要将ID属性的bindable约束设置为true,例如

class Employee {
    Long id
    String name

    static constraints = {
        id bindable: true
    }
}