Yas*_*uri 7 grails flush grails-orm
我正在关注Grails in Action中的示例.我有一个问题,了解该addTo*()功能的工作原理.
我有一个简单的域:User,Post,Tag具有以下关系:
当我运行以下代码(第一种情况)时:
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}
Run Code Online (Sandbox Code Playgroud)
我明白了:
null grails
null groovy
null A groovy post null
Run Code Online (Sandbox Code Playgroud)
如果我将第4,5和8行更改为:
4. user.addToTags(tagGroovy).save(flush: true)
5. user.addToTags(tagGrails).save(flush: true)
8. user.addToPosts(groovyPost).save(flush: true)
Run Code Online (Sandbox Code Playgroud)
我明白了:
2 grails
1 groovy
1 A groovy post Tue Nov 22 21:00:00 WET 2011
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么在第一种情况下id,dateCreated属性不会持久存在吗?
Tom*_*Lin 10
这真的是一个休眠问题.
只有在保存用户对象时才会保存整个对象图.因此它们与用户相关联但尚未保留在数据库中,因此它们没有ID.
在您的示例中,如果在get(1)行之前添加User.save(flush:true),您将看到所有新帖子都保留在数据库中.
Peter Ledbrook在这篇文章中解释得更好 - http://blog.springsource.org/2010/06/23/gorm-gotchas-part-1/