私は簡単なユースケースを持っていますが、うまくいきません。
このresumeアクションは、データベースからオブジェクトを取得し、それをセッション スコープに格納してから、オブジェクトのフィールドを変更できるフォームを表示するビューをレンダリングします。保存はフォームの送信を処理し、更新されたオブジェクトを永続化する必要があります。ドメイン オブジェクトは、プリミティブ フィールドと複合フィールドで構成されます。この問題は、他のスレッドで議論されている grails セッション スコープ、休止状態の永続化セッションに関係していますが、うまくいかないようです。ドキュメントやその他の議論を読むと、 を使用する必要があるようですattach()が、機能せず、LazyInitialization以下の例外が発生します。を行わないとmerge()、同じ例外が発生します。
could not initialize proxy - no Session. Stacktrace follows:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at com.toxservices.ApplicationController$_saveRequestForService_closure1$$EOB7zOh6.doCall(ApplicationController.groovy:302)
    at org.grails.datastore.gorm.GormStaticApi.withTransaction(GormStaticApi.groovy:573)
を使用merge()しても例外は発生しませんが、オブジェクトの値がデータベースで更新されないため、機能していないようです。フォームの送信時に更新された値が表示され、保存メソッドはエラーになりませんが、値は更新されません。
私は何を間違っていますか?これは非常に典型的な使用例のように見えるため、非常に不可解です。サンプルコードは以下です。関連する部分だけを残すようにスクラブしました。
def resume(){
    def rfs = Rfs.get(params.id)
    session.rfs = rfs
    render(view: "index", model: [rfs:rfs]) 
}
//index presents a form where Rfs can be updated and form re-submitted
def save() {
    def rfs
    if(session.rfs){
        rfs = session.rfs
        captureFormData(rfs, params)
        saveRfs(rfs, true)
    }
}
private def saveRfs(rfs, merge) {
//      if(!rfs.isAttached()){
//          rfs.attach()
//      }
    if(merge){
        rfs = rfs.merge()
    }
    Rfs.withTransaction {
        rfs.product.hAddress.address.save()
        rfs.product.mAddress.address.save()
        rfs.product.sContact.address.save()
        rfs.product.tContact.address.save()
        rfs.product.mContact.address.save()
        rfs.product.hAddress.save()
        rfs.product.mAddress.save()
        rfs.product.sContact.save()
        rfs.product.tontact.save()
        rfs.product.mContact.save()
        rfs.product.X.save()
        rfs.product.save()  
        ...
        rfs.save()
    }   
}