2014-10-29 208 views
1

情境:Grails .save(flush:true)不会立即保存数据

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

第一个请求的任务是

  1. 节省了一本书实例BOOK1 book1.save(flush: true);
  2. 在同一时间等待60秒或BOOK1的属性是由第二个请求另一个请求更新

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

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

我该如何解决问题?

+0

是,如果是,有多少你的对象仍然存在于数据库花费的时间? – Abs 2014-10-29 08:54:10

+0

Book是一个域对象,甚至在book1.save(flush:true)之后显示主键ID,但是我无法获得第二个请求中的数据 – 2014-10-29 09:32:15

+0

您是否在保存期间检查是否违反了任何约束:failOnError:true ? – Abs 2014-10-29 09:48:30

回答

6

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

有四种方式说,如果对象可以前保存保存

  • validate方法。它应该返回true
  • hasErrors属性之前保存。它应该返回false,如果一切正常
  • save方法返回实例
  • save(failOnError: true)参数验证失败时

如果你完全肯定的是,对象被保存然后检查引发错误这个:

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

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

+1

另一篇很长的文章是11篇系列文章,指出了Hibernate/GORM的许多主要问题:http://rpeszek.blogspot.com/2014/08/i-dont-like-hibernate-and- grails-part-1.html – 2014-10-29 15:38:04

+0

如果你发现服务中抛出的错误,该怎么办?交易是否会回滚? – Omnipresent 2017-09-23 09:47:48