我有一个简单的用例,它不起作用。
该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()
}
}