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