在 Grails 2.1.0 上,我正在尝试动态更新域类上的字段。该对象被绑定并且看起来很好,直到调用了 save 方法,这会引发以下异常:
java.lang.IllegalStateException:无法使不可变实体可修改。
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'
}
}
所以我想现在我的问题是如果一个域正在使用缓存,为什么我们不能更新它的值?或者我们该怎么做?如果域是不可变的,有没有办法捕获?
谢谢