2011-11-22 10 views
7

Estoy siguiendo el ejemplo en Grails in Action. Tengo un problema para entender cómo funciona la función addTo*().Grails addTo * aclaración

que tienen un dominio sencillo: el usuario, Post, Etiqueta con las siguientes relaciones:

  • usuario 1-a-M Mensaje
  • Usuario 1-a-M Tag
  • mensaje M-a Tag -M

Cuando ejecuto el siguiente código (primer caso):

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} 

me sale esto:

null grails 
null groovy 
null A groovy post null 

Y si cambio de las líneas 4, 5 y 8 a:

4. user.addToTags(tagGroovy).save(flush: true)    
5. user.addToTags(tagGrails).save(flush: true)  
8. user.addToPosts(groovyPost).save(flush: true) 

me sale esto:

2 grails 
1 groovy 
1 A groovy post Tue Nov 22 21:00:00 WET 2011 

Puede alguien explicar por qué en el primer caso, las propiedades id y dateCreated no se conservan?

Respuesta

10

Es realmente un problema de hibernación.

Todo el gráfico de objetos se guarda solo cuando guarda el objeto de usuario. Por lo tanto, están asociados con el usuario pero aún no se han conservado en la base de datos, por lo que no tienen identificadores.

En su ejemplo, si agrega User.save (flush: true) antes de obtener (1) líneas, verá que todas las nuevas publicaciones se conservan en la base de datos.

Peter Ledbrook lo explica un poco mejor en esta publicación - http://blog.springsource.org/2010/06/23/gorm-gotchas-part-1/