如果我在我的Grails命令对象中使用GORM域对象,命令对象会自动提交对域对象的更改,即使我没有调用save()方法。默认情况下,Grails命令对象为什么会提交对域对象的更改?
我想绑定到命令对象中的GORM对象,但不保存或提交对数据库的更改。如果我的控制器或我的服务引发异常,我希望事务回滚。
我可以用下面的注释强制我想要的行为,但那感觉就像我在做这个艰难的方式。
Controller Class = @Transactional(readOnly = true)
Controller action method = @Transactional
Command Object Class = @Transactional(readOnly = true)
Service Class = @Transactional
我做错了什么,Grails域对象是否应该由命令对象自动提交,除非我添加所有这些注释?
但我所看到的是绑定在命令对象中的对象隐式地在命令对象之后和控制器动作的第一行之前提交,而不是在动作结束之后提交。除非我如上所述注释,否则我似乎在命令对象中获得一个事务,并在该操作中获得另一个事务。 – DAC
你可以创建一个小型测试应用程序来演示这个吗?我想看看,所以如果你可以在Github或其他在线repo上做些工作,甚至可以将代码压缩并通过电子邮件发送给我,我希望能够追踪到这一点。如果这是一个真正的bug,那么报告它会很好。 –
行,找到了!演示应用程序没有相同的行为。事实证明,我们通过在命令对象中注入一个UtilService来帮助验证,从而导致了这个问题。该服务是**没有注释@Transactional(readOnly = true)',所以使用它开始了一个事务并返回到提交该事务的控制器操作。注释UtilService'@Transactional(readOnly = true)'解决了这个问题。 – DAC