gpt4 book ai didi

hibernate - 为什么将@Transactional与@Service一起使用而不是与@Controller一起使用

转载 作者:行者123 更新时间:2023-12-02 22:01:10 24 4
gpt4 key购买 nike

我在堆栈溢出文章中看到了很多评论,我发现了有关 @Transactional@Service@Controller 一起使用的某些内容

"Usually, one should put a transaction at the service layer."

"The normal case would be to annotate on a service layer level"

"Think transactions belong on the Service layer. It's the one that knows about units of work and use cases. It's the right answer if you have several DAOs injected into a Service that need to work together in a single transaction." [Source]

将@transactional与@service层一起使用的缺点

If I had 2 methods for example saveUser() and saveEmail() (because I store the emails in a database to send them later - like a queue) I would create in my service a method saveUserAndSendEmail(User user) which would be transactional. [Source]

这意味着我在服务层创建了许多方法,而不是如下所示的一个保存通用方法

public <T> long save(T entity) throws DataAccessException {
Session session = sessionFactory.getCurrentSession();
long getGenVal=(Long) session.save(entity);
return getGenVal;
}

根据上面的解决方案,这意味着我们有很多方法,比如下面的LOL..

public <T> long saveAccount(T entity)....

public <T> long saveWithAuditLog(T entity, K entity1)....

public <T> long saveWithAuditLogAndEntries(T entity, K entity, M entity)....

克服这种情况

我在@Controller中使用@Transactional,只需创建一个通用保存方法并使用这个简单的保存方法保存所有实体/模型。如果任何方法保存失败,则 Controller 中的所有事务都会成功回滚。

确保@Transactional应与@Controller一起使用的其他情况

在@Controller中:

pt.save(entity1);
pt.save(entity2);
int a = 2/0;
pt.save(entity3);

如果@Transactional on Service,前两个实体已成功保存,但第三个实体未回滚所有事务

如果@Controller上的@Transactional发生异常则所有事务回滚

为什么堆栈溢出询问“不要在 Controller 中执行事务。将它们放在服务层类中。”? [source]

最佳答案

您询问的是最佳实践,最佳实践是在服务层中标记@Transactional,因为@Controller不应该知道MVC中的数据持久性逻辑。
@Service 是根据分析生成的用例构建的,了解工作单元,并且还实现了重用方面的思考:如果您从 Web 上下文切换到桌面上下文(例如,或一些其他视觉前端),其中 @Controller 层不存在,您不会遇到问题,因为所有内容都封装在服务层中。
@Service 是一个契约,表示层的修改不需要重写 @Service 代码。
但是Spring并不关心你把事务边界放在哪里,你可以放在@Controller上,但你的应用程序可能会更难维护。

我希望这已经足够清楚了。抱歉,如果没有;英语不是我的母语。

关于hibernate - 为什么将@Transactional与@Service一起使用而不是与@Controller一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18498115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com