使用Spring MVC和Hibernate每个请求进行一次事务

时间:2019-02-01 15:16:40

标签: java spring hibernate open-session-in-view

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

我知道最佳实践包括使用@Transactional属性创建一个单独的服务层,但是我的应用程序不会从这种额外的复杂性中受益,我想尽可能地简化代码。

我了解到OpenSessionInViewInterceptor允许继续使用休眠会话,因此很可能满足了我的第二个要求。但是如何使所有控制器方法都具有事务性?

理想情况下,如果我需要的话,我希望有一种简单的方法来退出此行为。例如。所有方法都是事务性的,但是我可以应用类似@NonTransactional的方法,并更精细地管理事务。

1 个答案:

答案 0 :(得分:1)

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

请参见source

OpenEntityManagerInView也是如此。