使用SpringMVC和Hibernate的每个请求单个事务



我想使用Spring MVC和Hibernate。我不想在所有控制器方法上使用服务层或@Transactional属性(或者,我希望Spring将它们全部视为事务性方法)。所以我想在控制器方法开始处理数据库时启动事务,并在控制器方法返回ViewAndModel时提交事务,或者在出现任何错误时回滚事务。此外,我希望视图支持延迟休眠加载,例如,如果html模板请求,则以自动提交模式选择数据。

我知道,最佳实践涉及创建一个具有@Transactional属性的单独服务层,但我的应用程序不会从这种额外的复杂性中受益,我希望尽可能简化代码。

我已经了解到OpenSessionInViewInterceptor允许在视图中继续使用hibernate会话,所以这可能解决了我的第二个需求。但是,我如何使所有控制器方法都具有事务性?

理想情况下,如果我需要的话,我想要一种简单的方式来选择退出这种行为。例如,所有方法都是事务性的,但我可以应用@NonTransactional之类的东西,并更细粒度地管理事务。

实际上,OpenSessionInViewInterceptor会在任何控制器代码启动之前打开一个会话(隐含地是一个事务),并在http请求完成之前关闭它。因此,它应该同时满足您的两个需求。

参见来源

OpenEntityManagerInView也是如此。

最新更新