【发布时间】: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 为您处理呢?包含保存域类的代码(例如服务方法实现)也会对您有所帮助。
-
因为
ID是String类型,因为有时用户让计算机决定(其中计算机获得最大的全数字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