我正在关注Grails in Action中的示例。我有一个问题,了解addTo*()
函数的工作原理。
我有一个简单的域名:User,Post,Tag具有以下关系:
当我运行以下代码(第一种情况)时:
1. def user = new User(userId: 'joe', password: 'secret').save()
2. def tagGroovy = new Tag(name: 'groovy')
3. def tagGrails = new Tag(name: 'grails')
4. user.addToTags(tagGroovy)
5. user.addToTags(tagGrails)
6.
7. def groovyPost = new Post(content: 'A groovy post')
8. user.addToPosts(groovyPost)
9. groovyPost.addToTags(tagGroovy)
10.
11. User.get(1).tags.each {println it.id + " " + it.name}
12. User.get(1).posts.each {println it.id + " " + it.content + " " + it.dateCreated}
我明白了:
null grails
null groovy
null A groovy post null
如果我将第4,5和8行更改为:
4. user.addToTags(tagGroovy).save(flush: true)
5. user.addToTags(tagGrails).save(flush: true)
8. user.addToPosts(groovyPost).save(flush: true)
我明白了:
2 grails
1 groovy
1 A groovy post Tue Nov 22 21:00:00 WET 2011
有人可以解释为什么在第一种情况下id
和dateCreated
属性不会保留?
答案 0 :(得分:10)
这真是一个休眠问题。
只有在保存用户对象时才会保存整个对象图。因此,它们与用户相关联但尚未保留在数据库中,因此它们没有ID。
在您的示例中,如果在get(1)行之前添加User.save(flush:true),您将看到所有新帖子都保留在数据库中。
Peter Ledbrook在这篇文章中解释得更好 - http://blog.springsource.org/2010/06/23/gorm-gotchas-part-1/