【问题标题】:Grails domain not persisting even with flush: true parametersGrails 域即使使用 flush: true 参数也不会持续存在
【发布时间】:2015-06-12 04:03:22
【问题描述】:

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

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)。而且它不会返回任何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 语句?

【问题讨论】:

  • o.O 为什么要这样分配自己的 ID?为什么不让 Hibernate 为您处理呢?包含保存域类的代码(例如服务方法实现)也会对您有所帮助。
  • 因为IDString 类型,因为有时用户让计算机决定(其中计算机获得最大的全数字ID 例如0081795 1),或提供他自己的ID(大多数情况下变成字母数字 例如ag23d9b16
  • 那么除了无法保存之外,上述代码还有很多其他问题。祝你好运!
  • @JoshuaMoore 虽然编译器打印了status_e: AdjustmentCode : 14,这意味着domain 类被保存,但persisted 没有针对数据库。因为我认为.save() 如果不成功则返回null,否则返回domain 对象。所以我认为它保存了。
  • 如果你想用你的自定义 id 实现类似的东西,你应该在另一个属性中这样做。 id 是并且应该是技术性的东西,不应该被用户触及。看看grails sequence number generator plugin 的逻辑标识符...

标签: grails grails-orm


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多