为啥 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”

在 Grails (GORM) 中处理并发修改,同时避免过时对象异常

GORM级联保存的顺序取决于字段名称?真的吗?

为啥@Transactional 会自动保存到数据库