我想使用 Spring MVC 和 Hibernate。我不想在所有 Controller 方法上使用服务层或 @Transactional
属性(或者,更确切地说,我希望 Spring 将它们全部视为事务性的)。所以我想在 Controller 方法开始与数据库一起工作时启动事务,并在 Controller 方法返回 ViewAndModel 或发生任何错误时回滚事务时提交事务。我还希望 View 支持延迟 hibernate 加载,例如如果 html 模板请求,则以自动提交模式选择数据。
我知道最佳实践涉及创建一个带有 @Transactional
属性的单独服务层,但我的应用程序不会从这种额外的复杂性中受益,我想尽可能地简化代码。
我了解到 OpenSessionInViewInterceptor
允许在 View 中继续使用 hibernate session ,因此这可能解决了我的第二个要求。但是如何使所有 Controller 方法都具有事务性呢?
理想情况下,如果我需要的话,我想要一种简单的方法来选择退出这种行为。例如。所有方法都是事务性的,但我可以应用类似@NonTransactional 的方法并更精细地管理事务。
最佳答案
实际上,OpenSessionInViewInterceptor
将在您的任何 Controller 代码启动之前打开一个 session (并且隐含一个事务),并在 http 请求完成之前关闭它。所以它应该可以解决您的两个要求。
参见 source
OpenEntityManagerInView
也是如此。
关于java - 使用 Spring MVC 和 Hibernate 每个请求的单个事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54482259/