Grails数据绑定-无法使不可变实体可修改



在Grails 2.1.0上,我试图动态更新域类上的字段。对象被绑定,看起来很好,直到调用save方法,该方法抛出以下异常:

java.lang.IollegalStateException:无法使不可变实体可修改

try {
def bindParams = [:]
bindParams."$paramsFieldName" = "$paramsValue"
def domainClass = grailsApplication.domainClasses.find { it.clazz.simpleName == paramsDomain }.clazz
def objectInstance = domainClass.findById(paramsId)
objectInstance."$paramsFieldName" = "$paramsValue"
bindData(objectInstance, bindParams)
objectInstance.save(flush:true ,failOnError:false)
return objectInstance
}
catch (Exception ex) {
log.error ex
return null
}

我尝试使用直接分配绑定字段,效果很好。

objectInstance."$paramsFieldName" = convertToType( fieldType.name,paramsValue)

但是我需要处理每种情况的类型转换(我假设)。我需要的是BindDynamicMethod为我处理绑定。当使用使其不可变的BindDynamicMethod绑定对象时,对象会发生什么?。或者是我做错了什么导致了这种情况?

=============================================

部分解决

事实证明,这种情况发生在一些域上,但一些在映射中使用缓存的域抛出了这个异常。

class UploadSettings {
String profile = "default"
String displayName
String name 
String value 
String defaultValue 
static mapping = {
//cache usage:'read-only'
}
}

所以我想现在我的问题是,如果一个域正在使用缓存,为什么我们不能更新它的值?或者我们该怎么做?如果域是不可变的,有没有一种方法可以捕获?

感谢

是的,通过将其设置为只读,您将使对象不可变,正如错误所说,IMHO,这是误导性的,因为我们在缓存的上下文中,但这背后有一些理由。

如果你需要在域级别缓存,那么将其设置为读写应该可以完成

查看缓存使用

最新更新