【发布时间】:2014-08-07 03:48:50
【问题描述】:
Grails 新手在这里。我正在使用 GGTS 为简单的用户模型(字符串用户,字符串传递)生成控制器
在查看 GGTS 生成的代码时,我注意到某些操作(如 delete()、save() 和 update())上有 @Transactional 注释。
我的问题是,为什么在控制器中使用@Transactional,为什么在服务中不使用@Transactional?
grails 中的新手
【问题讨论】:
标签: grails
Grails 新手在这里。我正在使用 GGTS 为简单的用户模型(字符串用户,字符串传递)生成控制器
在查看 GGTS 生成的代码时,我注意到某些操作(如 delete()、save() 和 update())上有 @Transactional 注释。
我的问题是,为什么在控制器中使用@Transactional,为什么在服务中不使用@Transactional?
grails 中的新手
【问题讨论】:
标签: grails
在 grails 中,进行所有与数据库相关的工作和数据库事务的正确方法是在服务类中而不是在控制器中进行。因此,默认情况下控制器没有执行事务的权限,因此我们使用 @Transactional 注释。在服务中,默认情况下允许交易。
如果您使用执行某些 DB 事务的服务方法,那么您需要通过 @Transactional 注释使您的控制器操作具有事务性。而服务方法中无需提及。
如果您不使控制器具有事务性,则需要在服务类中提及它。
最佳做法是不要使用自动生成的代码,因为它对初学者来说不太容易维护。官方文档将是您最好的帮助,当您创建控制器时,您将找不到任何事务注释,而当您创建服务类时,您将在类级别看到事务注释。
附: - “创建”类不等于“生成”。
【讨论】:
render someResultVariable as JSON 以 JSON 格式(最简单的方式)发回您的数据