1

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'

    }
}

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

ありがとう

4

1 に答える 1

2

はい、読み取り専用に設定することで、エラーが示すようにオブジェクトを不変にしています。キャッシュのコンテキストにあるため、これは誤解を招く可能性がありますが、これにはいくつかの理論的根拠があります。

ドメインレベルでキャッシュが必要な場合は、読み書き可能に設定するとうまくいくはずです

キャッシュの使用状況を確認する

于 2012-11-30T04:47:01.050 に答える