2011-11-22 79 views
7

我正在关注Grails in Action中的示例。我有一个理解addTo*()函数如何工作的问题。Grails addTo *澄清

我有一个简单的域:用户,邮政,标记和下列关系:

  • 用户1到-M后
  • 用户1到-M标签
  • 后M-到-M标签

当我运行下面的代码(第一种情况):

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 

有人能解释为什么第一种情况下iddateCreated属性不会持久?

回答

10

这真的是一个休眠问题。

只有在保存用户对象时才会保存整个对象图形。因此,它们与用户相关联,但尚未保存在数据库中,因此它们没有ID。

在您的示例中,如果您在获取(1)行之前添加User.save(flush:true),则会看到所有新帖子都会保留在数据库中。

彼得Ledbrook解释它在这篇文章中更好一点 - http://blog.springsource.org/2010/06/23/gorm-gotchas-part-1/