如何使用 Spring 和 Hibernate 为 Web 应用程序和批处理作业设置事务

Posted

技术标签:

【中文标题】如何使用 Spring 和 Hibernate 为 Web 应用程序和批处理作业设置事务【英文标题】:How to set-up transactions for both the web application and batch jobs using Spring and Hibernate 【发布时间】:2018-02-06 11:11:06 【问题描述】:

我有一个使用 Spring 4.3 和 Hibernate 5.3 的应用程序。

有一个 Web 应用程序具有表示层、服务层和 DAO 层,以及一些共享相同服务和 DAO 层的作业。

使用@Transactional 注解在不同的层初始化事务。

这导致了我在这里描述的一个问题:使用 Spring 4.3 从外部事务控制内部事务设置

我阅读了一些关于如何设置事务以将 Spring 和 Hibernate 连接在一起的内容。看起来推荐的方法是在服务层初始化事务。

我不喜欢的是大多数事务的存在只是因为它们是休眠正常工作所必需的。

当我真的需要一个事务来调用多个服务方法的作业时,我似乎没有选择继续从作业初始化事务。所以将 @Transactional 注释从 DAO 移动到服务似乎没有任何区别。

您建议如何为此类应用程序设置交易?

【问题讨论】:

【参考方案1】:

请原谅我的回答,因为我无法发表评论

我不明白您必须继续从作业中初始化事务的意思?

通常用于

DAO类,注解@Repository@Service@Transactional 的服务类 Webservice,如果你有的话,@RestController@RequestMapping@Transactional

通过这样做,来自服务类的任何调用都将是 1 个事务,因此如果服务类 A 调用服务 B 和 C,即使服务类 C 抛出错误,整个事务也会回滚。

【讨论】:

以上是关于如何使用 Spring 和 Hibernate 为 Web 应用程序和批处理作业设置事务的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring 和 Hibernate 为 Web 应用程序和批处理作业设置事务

使用 spring 和 hibernate 时,如何处理会话/事务?

如何使用 JPQL、Spring Data Repositories 和 Hibernate 为 TimescaleDB `time_bucket` 函数参数化 Postgresql 间隔

Spring with Hibernate-如何动态传递模式名称

Spring Hibernate 关系映射

如何使用 Hibernate 为 Spring data JPA 的所有查找方法添加全局 where 子句?