2011-12-21 15 views
3

一時的なインスタンスエラーが発生しました。完全に解決できませんでした(下のUPDATEを参照してください)。私はクラスを持っている:org.hibernate.TransientObjectException::オブジェクトが保存されていない一時的なインスタンスを参照する - フラッシュする前に一時的なインスタンスを保存します。grails - 未保存の一時的インスタンスエラー

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 

エラーがあるmomentum.Order

私はいくつかの他の投稿を見てきましたが、findBy()は使用されていませんでした。また、休止状態のログを有効にしましたが、何も表示されません。どのようなエラーのアイデアですか?


* UPDATE:

capt.order = mt.order 

私は保存する前に、私はこれを行うことができますが:CAPTは、すなわち行を追加し、上記保存される前に、このエラーはCAPTで(設定)の順序をコピーすることによって解決することができますキャプション、私はこれを設定しなければ、なぜそれが問題であるかはっきりしない。私がそれを設定しなければ、キャプチャは正常に保存されますが、mtの最後/ 2回目のセーブでは上記のエラーが発生します。

[バージョンのGrails 1.3.7]


* UPDATE 2:私は上記のcapt.saveを削除し、私は同じMTがエラーを保存し得ます。これは、これら2つのインスタンスがmt.saveの問題まで関連していないことを示すように見えます。

答えて

0

いずれかの方法の問題は、あなたがその時によって

mt.save() 

を呼び出すときに含まれるOrderオブジェクトが一時保存されていない状態であることです。 "mt"を保存する直前に保存してください。

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

さらに推測(単なる推測):それはあなたがどこかに現在のセッションを無効にし、注文が過渡状態である理由があるであろう間でのシングルトントランザクションサービスのメソッドを呼び出すことをすることができます。以前Grails 1.3.7に似たような問題がありました。

関連する問題