为啥 GORM 不保存我的对象?
Posted
技术标签:
【中文标题】为啥 GORM 不保存我的对象?【英文标题】:Why is GORM not saving my object?为什么 GORM 不保存我的对象? 【发布时间】:2012-02-28 22:59:39 【问题描述】:如果我在 Grails 控制台中执行此代码:
def p = new Post(title: "T");
p.save(flush: true); // or p.save();
Post.count();
GORM 没有抛出任何异常,但数据没有保存在我的数据库中。我做错了什么?
【问题讨论】:
在我的情况下,我有另一部分代码正在删除我的行,就在创建新行之后...... :( 【参考方案1】:您很可能违反了约束。将failOnError: true
添加到您的保存方法参数中。然后当你的保存失败时你会得到一个异常。 (或者,您可以检查保存的返回值,如果它是错误的,则打印出p.errors.allErrors()
。)
验证和保存是一起完成的。如果您正在验证绑定到某个域对象的用户提交的数据,那么为了检查由于无效输入而导致的保存失败,惯用的做法是检查保存的返回值;由于无效输入而失败并不是异常行为。如果您只是想保存对象的内容并希望在出现问题时抛出异常,请使用failOnError
。
更多关于他们设计 GORM 的基本原理,以便您需要这样做see this article。
【讨论】:
你也可以在你的域对象上使用 'validate()',如果它返回 false,不要调用它的 'save()' 方法。而是让控制器向用户返回一条消息。 如果我设置了 failOnError:true 并且没有异常,而对象被 Grails 标记为“未保存”怎么办? 另外,我试图在错误对象列表中找到错误消息。到目前为止还没有运气。【参考方案2】:可能违反了Post
的某些约束,因此对象没有被保存。请注意,GORM 的默认行为不是在保存失败时抛出。您需要像这样称呼它
p.save(flush: true, failOnError: true);
或者通过添加全局改变行为
grails.gorm.failOnError=true
到你的 Config.groovy
【讨论】:
以上是关于为啥 GORM 不保存我的对象?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Python 不使用对象 .save() 将我的模型保存到数据库?
使用db.Create和db.FirstOrCreate将数据保存到数据库时,“ID”列的值为“0”