grails - 未保存的瞬态实例错误

时间:2011-12-21 07:17:36

标签: grails gorm

我收到一个瞬态实例错误我无法完全解决(请参见底部的更新)。我有课程:

 class Order {
    static hasMany = [products: Product, transactions: MoneyTransaction]
    ...
    static constraints {
      transactions(minSize: 1) // order must have at least an authorization MoneyTransaction
          ...
    }
 }

 class MoneyTransaction {
     Order order 
       ...  
     static constraints = {
        order(nullable: true)
          ...
     }
 }

我的控制器代码是

  MoneyTransaction mt = new MoneyTransaction(...)
      ...
  if (!mt.save(flush: true))  { log, render an error }  // no error occurs
  else { 
     println "mt saved, id: ${mt.id}"    // prints out mt id fine
     Order order = new Order(...)
         ...
     order.addToTransactions(mt)
     mt.order = order
     if (!order.save(flush: true)) { log, render an error } // no error occurs
     else {
       println "order saved, id: ${order.id}" // prints out order id fine

       // a method is called that creates a second MoneyTransaction that does the capture of
       // the previous authorization,  this method essentially does:
       MoneyTransaction capt = new MoneyTransaction(...)  // *** order is not set here ***
       if (! capt.save()) { log, render an error } // no error occurs
       println "capt saved, id: ${capt.id}"    // prints out capt id fine
       mt.relatedAction = "..."  // this is a MoneyTransaction String field              

       if (!mt.save(flush: true))  { log, render an error } // get error

错误是: org.hibernate.TransientObjectException:object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:momentum.Order

我看了一些其他的帖子,我没有使用任何findBy(),而且我还打开了hibernate的日志记录,但这并没有透露任何内容。关于错误是什么的任何想法?


*更新:可以通过在上面保存捕获之前复制(设置)捕获中的顺序来解决此错误,即添加以下行:

 capt.order = mt.order

虽然我可以在保存捕获之前执行此操作,但我不清楚为什么如果我没有设置它就会出现问题。如果我没有设置它,注意捕获保存很好,但mt的最后/第二次保存会产生上述错误。

[版本Grails 1.3.7]


*更新2:我删除了上面的capt.save,但是我得到了同样的mt save错误。这似乎表明这两个实例与mt.save问题无关。

1 个答案:

答案 0 :(得分:0)

无论哪种方式,问题是当你打电话

mt.save()

到那时包含的Order对象处于瞬态未保存状态。在尝试保存“mt”之前尝试保存它。

order.save()
mt.order = order
mt.save()

进一步猜测(只是一个猜测):可能是你在其间某处调用单例事务服务方法,这将使当前会话无效,这就是Order处于瞬态的原因。我以前和Grails 1.3.7有过类似的问题。