【发布时间】:2018-07-04 19:30:18
【问题描述】:
是否只保留了域对象实例上的第一个 save()?
环境:Grails 3.3.5、GORM 6.1.9 我相信、PostgreSQL 9.5、JDK 1.8.0_171、Ubuntu 16.04。
我的应用程序根据来自多个文本文件的输入创建 Recital(域对象)实例。这是一个数据库加载,所以一切都发生在一个控制器调用中,调用一个服务方法。一笔交易。
服务方法解析输入流以寻找演奏会。当它找到一个时,它会尝试 findBy 方法(演奏会编号)。如果有给定编号的 Recital,它会从输入更新它并执行 save()。否则,它会从输入创建一个新实例并执行 save()。 failOnError 无处不在。独奏会不属于任何东西,没有级联问题。
程序逻辑无法判断修改是否是实例的最后一次更新。因此,每次更改后都会有一个 save() 。但这不起作用。看来你只能 save() 一次。
在数据库中找到的最终结果是只有第一个 save() 被持久化。在调试正在运行的程序时,我可以验证实例在内存中是否已完全更新。
如果这是正确的,文档应该说:save 方法通知持久性上下文应该保存或更新实例的当前状态。此后(在同一事务中)的任何和所有修改都将被忽略。 除非使用 flush 参数,否则对象不会立即持久化...
附: save() 文档将“flush: true”解释为刷新持久性上下文。这对新手来说几乎没有解释价值。一些“冲洗”同义词是:清洗、擦除、删除、清除、清扫、擦除。数据库人员可能会将其视为 ROLLBACK 而不是 COMMIT。解释当然是 Hibernate 术语。如果 Grails doco 大部分是独立的,那就太好了。 (同一文档中的附带问题。)
【问题讨论】:
-
你试过
.save(flush:true)吗?那是为了“现在”保存,不能对文档说什么:) -
是的,没有区别。然而,新的见解,见下文。
标签: grails grails-orm grails-3.3