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