You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Grails 4.1.4集成测试中Data Service无法更新Domain类的问题

Grails 4.1.4中GORM Data Service事务集成测试问题

我已创建公开Github仓库复现该问题。

问题背景

集成测试的目标是调用事务性BookService,再由它调用GORM Data Service更新Book对象,调用链路为:BookServiceIntSpec -> [BookService -> BookDataService],其中方括号内的执行本应受BookService的@Transactional注解事务管控。

测试用例

  • 使用GORM在服务中无需新事务即可更新Book:BookService中通过toUpdate.save(flush: true, failOnError: true)实现更新,集成测试验证更新后可通过Book.findByTitle找到修改后的对象。
  • 使用Data Service时无需新事务无法更新Book:BookService调用bookDataService.save(toUpdate),集成测试验证更新后无法找到修改后的对象。
  • 使用Data Service并开启新事务可更新Book:在测试中通过Book.withNewTransaction包裹调用,更新成功且可找到修改后的对象。

问题分析推测

该现象可能是Grails 4.1.4集成测试运行时的bug,或是文档未明确事务服务的测试用法,推测原因如下:

  • 测试运行时关闭事务后未刷新会话
  • 测试中创建的事务导致GORM代码无法访问同一Hibernate会话

后续验证

  • 在服务方法中显式调用sessionFactory.currentSession.flush(),测试可正常执行,无需新事务。
  • 通过Hibernate日志验证,未flush时无update语句,flush后出现update语句,排除缓存问题。

现询问是否有遇到该现象的开发者,或能解释该行为的原因,以避免每次调用都包裹withNewTransaction。

内容的提问来源于stack exchange,提问作者Luis Muñiz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:12:39