【问题标题】:GORM save() on Grails is not saving in the DBGrails 上的 GORM save() 未保存在数据库中
【发布时间】:2017-11-25 14:43:33
【问题描述】:

我有一个需要保存的对象列表,我有这个功能

private saveAll(List<Element> elements){
    for(Element element: elements){
        element.save(flush:true, insert:true)
    }
}

我的元素类(groovy类)如下:

@ToString(excludes = 'metaClass,content', includePackage = false, includeNames = false)
class Element {

    Integer id
    MessageSourceType sourceType
    String key
    String valueEN
    String valueDE
    String valueES
    String valueFR
    String valueIT
    String valuePT
    String valueAR
    String valueCMN
    String valueHI
    String valuePL

    static constraints = {
        sourceType nullable: false, blank: false, maxSize: 256
        key nullable: false, blank: false, maxSize: 254, unique:true
        valueEN nullable: true, maxSize: 64000
        valueDE nullable: true, maxSize: 64000
        valueES nullable: true, maxSize: 64000
        valueFR nullable: true, maxSize: 64000
        valueIT nullable: true, maxSize: 64000
        valuePT nullable: true, maxSize: 64000
        valueAR nullable: true, maxSize: 64000
        valueCMN nullable: true, maxSize: 64000
        valueHI nullable: true, maxSize: 64000
        valuePL nullable: true, maxSize: 64000
    }

    static mapping = {
        table "element"
        id column: "eId"
        version column: "eVersion"
        sourceType column: "eSourceType"
        valueEN column: "eValueEN"
        valueDE column: "eValueDE"
        valueES column: "eValueES"
        valueFR column: "eValueFR"
        valueIT column: "eValueIT"
        valuePT column: "eValuePT"
        valueAR column: "eValueAR"
        valueCMN column: "eValueCMN"
        valueHI column: "eValueHI"
        valuePL column: "eValuePL"
    }

    @Override
    public boolean equals(Object element){
        if(element != null && element instanceof Element){
            if(this.getKey().equalsIgnoreCase(((Element)element).getKey())){
                return true;
            }
        }
        return false;
    }

}

在每次保存时,我都会收到以下日志:

2017-11-25 16:38:56,787 | TRACE |  | localhost-startStop-1 | org.codehaus.groovy.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor | executing insertions
2017-11-25 16:38:56,787 | DEBUG |  | localhost-startStop-1 | org.codehaus.groovy.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor | executing identity-insert immediately

但是当我检查数据库中的表时,我发现它是空的,没有反映任何插入。我不明白为什么不会引发错误,或者为什么数据没有保存在数据库中

您能否检查我的代码是否有任何问题(我是 groovy/grails 新手)或指导我为什么会发生这样的行为?

【问题讨论】:

  • 发生这种情况的原因有很多。一种是稍后将事务回滚。验证可能会失败(您可以通过在调用 .save(...) 时包含 failOnError: true 来排除这种情况。
  • @JeffScottBrown 我已将 failOnError 设置为 true 并作为属性添加到 save 方法,但没有记录错误!
  • failOnError 不一定会导致记录任何内容,但如果没有引发表明验证没有失败的异常。如果没有看到示例项目,可能很难回答您的问题。正如我之前所说,数据可能无法保存的原因有很多,而仅element.save(flush:true, insert:true) 不足以诊断问题。抱歉,我帮不上忙。祝你好运!

标签: hibernate grails grails-orm


【解决方案1】:

试试这个,看看你是否遇到任何错误:

private saveAll(List<Element> elements){
    for(Element element: elements){
        element.validate()
        if (element.hasErrors()) {
            element.errors.allErrors.each {
               println it
           }
        } else {
          element.save(flush: true)
        }
    }
}

此外,如果从服务调用 saveAll,请通过添加静态属性 (static transactional=false) 删除事务声明,看看是否会有所作为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2017-01-16
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多