私は簡単なユースケースを持っていますが、うまくいきません。
この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()
}
}