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
相关产品推荐
相关产品推荐

