Grails addTo *澄清

时间:2011-11-22 21:26:16

标签: grails gorm flush

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

我有一个简单的域名:User,Post,Tag具有以下关系:

  • 用户1对M帖子
  • 用户1对M标签
  • 发布M-to-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属性不会保留?

1 个答案:

答案 0 :(得分:10)

这真是一个休眠问题。

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

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

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