我收到一个瞬态实例错误我无法完全解决(请参见底部的更新)。我有课程:
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问题无关。
答案 0 :(得分:0)
无论哪种方式,问题是当你打电话
mt.save()
到那时包含的Order对象处于瞬态未保存状态。在尝试保存“mt”之前尝试保存它。
order.save()
mt.order = order
mt.save()
进一步猜测(只是一个猜测):可能是你在其间某处调用单例事务服务方法,这将使当前会话无效,这就是Order处于瞬态的原因。我以前和Grails 1.3.7有过类似的问题。