validation - Grails域对象在验证期间意外保存

标签 validation grails gorm grails-domain-class grails-validation

考虑以下域类:

class EnrichmentConfig {

    String name
    String description
    String concept
    List fields = []

    static hasMany = [fields: FieldConfig]

    static constraints = {
        name(maxSize: 60, blank: false, nullable: false, unique: true)
        concept(maxSize: 255, blank: false, nullable: false)
        description(nullable: true, blank: true)
        fields(nullable: false, validator: { fields, enrichmentConfig ->
            if (fields?.isEmpty()) {
                return ['empty']
            } else {
                return true
            }
        })
    }

    static mapping = {
        description(type: 'text')
        fields(cascade: "all-delete-orphan")

        sort('name')
    }
}


class FieldConfig {

    List providers = []

    static hasMany = [providers: String]

    static belongsTo = [mainConfig: EnrichmentConfig]

    static constraints = {

        providers(nullable: false, validator: { providers, fieldConfig ->
            // some custom validation
        })
    }

    static mapping = {
        providers(cascade: 'all-delete-orphan', lazy: false)
    }
}

在这里,我用于更新关联 Controller 中的EnrichmentConfig实例的代码:
def update = {

    def enrichmentConfig = EnrichmentConfig.get(params.long('id'))
    if (enrichmentConfig) {

        enrichmentConfig.properties = params

        if (enrichmentConfig.validate()) {
            if (enrichmentConfig.save(flush: true, failOnError: true)) {
                    flash.message = "${message(code: 'enrichmentConfig.updated.message', args: [enrichmentConfig.name])}"
                    redirect(controller: 'enrichment')
                }
        } else {
            // re-validation to attach an error object to each eroneous fieldConfig
            enrichmentConfig.fields?.each { it.validate() }
        }
        render(view: 'fields', model: getFieldsModel(enrichmentConfig))
        return
    } else {
        flash.message = "${message(code: 'enrichmentConfig.not.found.message', args: [params.id])}"
        redirect(controller: 'enrichment')
    }
}

我注意到,当我验证EnrichmentConfig实例要更新时,关联的FieldConfig实例意外地保存在数据库中,即使它们无效。
实际上,在调试逐步模式下,当执行enrichmentConfig.validate()时,控制台中将显示以下内容:
    Hibernate: 
    update
        field_config_providers 
    set
        providers_string=? 
    where
        field_config_id=? 
        and providers_idx=?

怎么会这样呢?我究竟做错了什么?
我应该指定使用grails 1.3.7。

在此先感谢您的帮助。

最佳答案

这只是一个猜测,但可能是从某个地方开始的。我不假装理解Hibernate何时决定刷新 session 并部分保存数据等。但是我所知道的是,将所有与写入相关的调用都放入服务中可以节省大量的时间。

尝试将一些更新方法移至服务,看看是否有更好的运气。我的直觉是,休眠状态可能需要持久化某些数据来做其他事情,并且如果它们处于事务服务中,那么一旦抛出RuntimeException,该写操作就会回滚。

关于validation - Grails域对象在验证期间意外保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10929958/

相关文章:

validation - 有没有针对 HTML 和 CSS 的命令行验证工具?

regex - 拆分 XSD 中的正则表达式模式限制

javascript - jQuery 验证插件 : validate decimal number with comma as decimal separator

spring - Grails Intellij resource.groovy错误

hibernate - Grails Domain Binder.getMapping(Domain)对于Grails-3.2.4中的非持久性域返回null

hibernate - Grails:使用Where查询选择具有给定id(子查询)的Child of Parent的子代

php - 联系表格 7 - 自定义验证

grails - 如果表行颜色在gsp中包含某个值,是否可以更改表行颜色?

gradle - 找不到Grails CXF插件

grails - Gorm Findallby日期提示