2011-11-22 130 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/