【问题标题】:Grails .save(flush: true) does not save data instantlyGrails .save(flush: true) 不会立即保存数据
【发布时间】:2014-10-29 08:24:06
【问题描述】:

情况:

我使用名为 firstService 的 Grails 资源和服务发送请求;

第一个请求的任务是

  1. 保存一本书实例 book1 book1.save(flush: true);
  2. 同时等待 60 秒或 book1 的属性被第二个请求的另一个请求更新

但是当我使用book1.save(flush: true); 保存时,它不会立即保存,这就是为什么在 60 秒内第二个请求找不到 book1 实例;

第二个请求的任务只是更新第一个请求的数据。

我该如何解决这个问题?

【问题讨论】:

  • 如果是,您的对象是否在数据库中持续存在,需要多长时间?
  • Book 是一个域对象,甚至它在 book1.save(flush: true) 之后显示主键 id,但我无法在第二个请求中获取数据
  • 你是否检查过保存过程中是否违反了约束条件:failOnError: true?
  • book1.save(flush: true) 返回 true,这里值得注意的是 - 在第一次请求之后 book1 被正确保存。但我需要在运行第一个请求时这样做。

标签: hibernate grails grails-orm


【解决方案1】:

book1.save() 不返回true,返回自身(book1)或出错时返回null。

有四种方法可以判断对象是否可以保存

  • validate 方法之前保存。它应该返回 true
  • hasErrors 属性 之前 保存。它应该返回 false
  • save 方法如果一切正常则返回实例
  • 带有(failOnError: true) 参数的save 方法在验证失败时会引发错误

如果您完全确定对象已保存,请检查:

  • 您是否将对象保存在测试上下文中?测试清理数据库,您必须在每个中创建对象或使用setup 方法来创建它
  • 您是否将对象保存在服务中?服务是事务性的,因此如果在保存后出现错误,那么所有事务都会回滚。

注意:每个 Grails 开发人员都必须阅读@pledbrook 文章GORM Gotchas

【讨论】:

  • 另一个,很长的阅读,是 11 部分系列,指出了 Hibernate/GORM 的许多主要问题:rpeszek.blogspot.com/2014/08/…
  • 如果你在服务中发现抛出的错误怎么办。事务还会回滚吗?
  • 是的,这是 ORM 需要工作的原因之一,捕获自己的异常并不意味着整个事务中的错误。
猜你喜欢
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多