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