使用domainClass.properties = params将所有传入请求参数绑定到域类对象是非常常见的。我不明白为什么这个任务会自动更新域对象。例如grails - 数据绑定后的奇怪行为
def update = {
def book = Book.get(1)
book.properties = params
book.discard()
}
params分配更新域对象。丢弃方法没有效果。谁能帮我?
使用domainClass.properties = params将所有传入请求参数绑定到域类对象是非常常见的。我不明白为什么这个任务会自动更新域对象。例如grails - 数据绑定后的奇怪行为
def update = {
def book = Book.get(1)
book.properties = params
book.discard()
}
params分配更新域对象。丢弃方法没有效果。谁能帮我?
discard()方法不会重置书实例,只会阻止它被Grails自动保存。要重置书实例,您需要重新加载它,例如使用Book.get(1)。
而book.properties = params只会尝试将params地图中的元素分配给Book属性,其中属性名称与地图项键相同。我相信这是标准的Groovy功能,而不是Grails特有的。
感谢您的答案。我的问题是,通过数据绑定的obj得到坚持当域obj的一些属性。已经变了。看到我的评论之前。 – hitty5 2010-09-27 07:06:42
我不知道为什么Ruben的答案被选定为正确的。 @ hitt5的行为是预期的,但是是不同的,你会在这里找到原因: http://blog.springsource.org/2010/06/23/gorm-gotchas-part-1/ 请参阅'现在你正在保存,当我不想你?!'尤其是。
当你说“自动更新”时,你的意思是域对象是否被保留?只是试图澄清发生了什么。 – 2010-09-22 13:47:17
我想我们在这里需要更多的上下文。数据连接是什么?它是如何设置的?做book.properties = params除了将对象属性的值设置为params中的内容外别无其他。它不保存对象。 – mfloryan 2010-09-22 14:40:29
是的,“自动更新”意味着doamin对象被持久化。 connectin数据是一个简单的hsqldb。我实施了一个非常简单的例子来清除问题。想象我们这个控制器动作: DEF书= Book.get(1) book.properties =参数 [书:书] futhermore书域类有一个更新前闭合到journalize每次更新。 def beforeUpdate = { log.error“update book” } 这本书只有一个道具 - >字符串标题。在更新被调用之前,每次通过数据绑定更改道具。所以这意味着书obj。得救了吗? – hitty5 2010-09-27 07:04:39