2011-11-22 7 views
7

私はGrails in Actionの例に従っています。 addTo*()の機能の仕組みを理解しています。 Grails addTo * clarification

私は、単純なドメインを持っている:ユーザー、ポスト、以下の関係を持つタグ:

  • ユーザー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はない。

例では、get(1)行の前にUser.save(flush:true)を追加すると、新しい投稿がすべてデータベースに保存されることがわかります。

Peter Ledbrookがこの投稿で少し詳しく説明しています - http://blog.springsource.org/2010/06/23/gorm-gotchas-part-1/