Grails addTo * уточнение - PullRequest
       14

Grails addTo * уточнение

7 голосов
/ 23 ноября 2011

Я следую примеру в Grails в действии.У меня проблема с пониманием того, как работает функция addTo*().

У меня есть простой домен: пользователь, публикация, тег со следующими отношениями:

  • Пользователь 1-to-MСообщение
  • Тег пользователя 1-в-М
  • Сообщение тега М-М

Когда я запускаю следующий код (первый случай):

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 не сохраняются?

1 Ответ

10 голосов
/ 23 ноября 2011

Это действительно спящий вопрос.

Весь граф объекта сохраняется только при сохранении вашего пользовательского объекта. Таким образом, они связаны с пользователем, но еще не сохранены в базе данных, поэтому у них нет идентификаторов.

В вашем примере, если вы добавите User.save (flush: true) перед строками get (1), вы увидите, что все новые сообщения сохраняются в базе данных.

Питер Ледбрук объясняет это немного лучше в этом посте - http://blog.springsource.org/2010/06/23/gorm-gotchas-part-1/

...