Grails newb在这里。我正在使用GGTS为简单的用户模型生成控制器(字符串用户,传递的字符串)
在查看GGTS生成的代码时,我注意到某些操作有@Transactional注释,如delete(),save()和update()。
我的问题是,为什么@Transactional在控制器中使用,为什么@Transactional没有在服务中使用?
Grails中的Newb
答案 0 :(得分:5)
在grails中,执行所有与DB相关的工作和数据库事务的正确方法是在服务类而不是控制器中执行。因此,默认情况下,控制器没有执行事务的权限,因此我们使用@Transactional注释。虽然在服务中默认允许交易。
如果使用执行某些数据库事务的服务方法,则需要通过@Transactional注释使控制器操作成为事务性事务。虽然无需在服务方法中提及它。
如果您不进行控制器事务处理,那么您将需要在服务类中提及它。
最佳做法是不使用自动生成的代码,因为初学者的可维护性较差。官方文档将是您的最佳帮助,当您创建控制器时,您将无法找到任何事务注释,而当您创建服务类时,您将在类级别看到事务注释。
P.S。 - “创建”类不等于“生成”。