即使使用 flush: true 参数,Grails 域也不会持久存在

Grails domain not persisting even with flush: true parameters

我在使用 Grails 插入新记录时遇到困难 domain class:

Integer lastId = AdjustmentCode.createCriteria().get {
    projections { max "id" }
} as Integer

def adjustmentCode = new AdjustmentCode()
adjustmentCode.setId(String.valueOf(lastId + 1))
adjustmentCode.setDescription(description)
adjustmentCode.setType(type)
adjustmentCode.setStatus(status)

println "before saving"
def status_e = adjustmentCode.save(flush: true, failOnError: true)

println "status_e: $status_e"
if(!status_e) { println adjustmentCode.errors.allErrors() }

println "after saving"

控制台显示:

before saving
status_e: AdjustmentCode : 14
after saving

adjustmentCode.save(flash: true, failOnError: true) 没问题,我提供了所有 required(还有所有 nullable)。它不会 returns 任何 error 消息,也不会到达 println adjustmentCode.errors.allErrors() 行。为什么它没有保存似乎是什么错误?


编辑 1: 由于 zoran119 建议启用 sql logging,我发现 .save() 函数会生成一个update 语句,而不是 insert 语句。现在我明确地告诉 .save () 函数它应该使用 insert 参数创建一个 insert sql 语句:

def status_e = adjustmentCode.save(flush: true, failOnError: true, insert: true)
                                                                   ^^^^^^^^^^^^

但它仍然执行 update 查询!我应该怎么做才能让它创建一个 insert 语句?

问题可能是您手动设置了 id -- 这有点危险,因为这意味着如果 id 已经存在,您将执行 update 而不是 insert (假设 unique/primary 键)。尝试让数据库处理 id 生成,你应该没问题。