Grails的。保存对会话范围内对象的更新不起作用。 LazyInitializationException中

时间:2013-07-09 20:35:46

标签: hibernate grails gorm

我有一个简单的用例,但不起作用。

resume操作从数据库获取对象,将其存储在会话范围内,然后呈现一个视图,该视图显示可以更改对象字段的表单。保存处理表单提交并需要保留更新的对象。域对象由原始和复杂字段组成。这个问题与grails会话范围,hibernate持久性会话有关,已经在其他线程中讨论过,但它似乎没有用。阅读文档和其他讨论,似乎我应该使用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()
    }   
}

0 个答案:

没有答案