【问题标题】:When should I call save() on an instance of a domain object in Grails?我应该什么时候在 Grails 中的域对象实例上调用 save()?
【发布时间】:2012-02-28 22:00:19
【问题描述】:

根据我的阅读,save() 通知持久性上下文应该保存或更新一个实例。但是,我在服务中有方法可以更改域实例的属性,而无需调用 save(),并且更改会立即出现在我的数据库中,没问题。

save() 方法是否只是一种更安全的方式来了解域实例将在进行更改后更新(并使用 failOnError 映射捕获错误)?每次我更改域实例的属性时都应该使用它还是过度使用它?

【问题讨论】:

  • 是数据库即时更新还是你的休眠缓存即时更新?
  • 我正在使用的MySql数据库正在更新中。

标签: grails persistence


【解决方案1】:

如果您创建一个域类的新实例,那么.save() 调用将告诉底层 Hibernate 层将新对象持久保存到数据库中。如果没有.save(),它将不会被持久化到数据库中。

如果您通过.get(myId) 检索对象,则任何更改都将在底层事务结束时自动保存到数据库中,因为 Hibernate 将对象视为“脏”。事务的结束是在对事务服务的方法调用结束或对控制器的请求结束时。在这些情况下,如果需要,您可以致电 .save(),但这不是必需的。它确实提供了通过.save(flush:true)failOnError 使用验证来轻松访问刷新Hibernate。

【讨论】:

  • 我使用 .findBy() 来检索对象,但我假设它与 .get 具有相同的“方法结束时保存”效果。跨度>
  • 是的,任何检索现有对象的方法都会发生持久化,除非它是像.read() 这样的只读检索。
  • 利用验证可能是save() 在持久化新实例之外最常见的用法之一。
猜你喜欢
  • 2023-04-10
  • 2016-05-02
  • 2012-12-02
  • 2010-09-19
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 2017-10-15
相关资源
最近更新 更多