Grails的数据绑定 - 不能让一个不变的实体修改(Grails data binding - C

2019-10-17 06:25发布

在一个Grails 2.1.0我试图动态更新的领域类的字段。 该对象被绑定,它看起来不错,直到保存方法被调用,它抛出以下异常:

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
    }

我试图通过直接分配新建分配FY绑定字段和运作良好。

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

但然后我需要处理各种情况下(I假设)的类型转换。 我需要的是BindDynamicMethod处理我的绑定。 使用使是不可改变的BindDynamicMethod结合,当它发生的对象是什么? 或者有什么我做错了,是造成的呢?

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

部分解决

原来,这是发生在一些领域,但有些在他们的映射使用缓存被扔这个异常。

class UploadSettings {
    String profile = "default"
    String displayName
    String name 
    String value 
    String defaultValue 

    static mapping = {
        //cache usage:'read-only'

    }
}

所以我想我的问题是,如果一个域使用缓存,为什么不能我们更新它的价值呢? 或者,我们该怎么办呢? 有没有一种方法来捕捉如果域名是不可变的?

谢谢

Answer 1:

是通过将其设定为只读的错误说你正在目标不变,因为我们是在高速缓存的情况下,但有一定的理由背后,恕我直言,这是一种误导。

如果您需要在域级别的缓存,然后将其设置为读写应该做的伎俩

见缓存用法



文章来源: Grails data binding - Cannot make an immutable entity modifiable