0

私は簡単なユースケースを持っていますが、うまくいきません。

この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()
    }   
}
4

0 に答える 0