即使使用 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 生成,你应该没问题。
我在使用 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 生成,你应该没问题。