我尝试更改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,但之后我将不得不改变所有的脚手架视图......
答案 0 :(得分:18)
这是数据绑定的一个特性。您不希望提交的数据能够更改id
和version
等托管字段,因此您使用的Map构造函数会绑定除这两个之外的所有可用属性(它也会忽略任何值) class
,metaClass
和其他几个人。)
所以这里有一点不匹配,因为这个值不是由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
}
}