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'
}
}
だから今私の質問は、ドメインがキャッシュを使用しているかどうかですが、なぜその値を更新できないのですか?または、どうすればそれを行うことができますか?ドメインが不変であるかどうかをキャプチャする方法はありますか?
ありがとう