【问题标题】:Grails addTo* clarificationGrails addTo* 说明
【发布时间】:2011-11-22 21:26:15
【问题描述】:

我正在关注 Grails in Action 中的示例。我在理解 addTo*() 函数的工作原理时遇到了问题。

我有一个简单的域:用户、帖子、标签,具有以下关系:

  • 用户一对一帖子
  • 用户一对一标签
  • 发布 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 属性没有持久化吗?

【问题讨论】:

    标签: grails grails-orm flush


    【解决方案1】:

    这确实是一个休眠问题。

    仅当您保存用户对象时,才会保存整个对象图。因此它们与用户相关联,但尚未保存在数据库中,因此它们没有 id。

    在您的示例中,如果您在 get(1) 行之前添加 User.save(flush: true),您将看到所有新帖子都保存在数据库中。

    Peter Ledbrook 在这篇文章中解释得更好 - http://blog.springsource.org/2010/06/23/gorm-gotchas-part-1/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 2015-09-29
      • 1970-01-01
      相关资源
      最近更新 更多