java - 使用 Spring MVC 和 Hibernate 每个请求的单个事务

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

我想使用 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/

相关文章:

java - org.hibernate.lockmode.pessimistic_write 的行为

java - 鼠标监听器不适用于界面

java - 池连接 tomcat 的 spring boot 中的 minIdle 属性在哪里?

Spring Boot Camel Route - 从休息端点获取数据

spring - Keycloak Spring 安全客户端凭据授予

java - 为 LocalSessionFactoryBean 映射位置指定正则表达式

java - Java 中的线程安全访问枚举

java - PrintStream 无法正确打印 unicode 字符 (UTF-16)

java - Spring Boot 保存数据到数据库 休息 1 天

java - session.connection() 在 Hibernate 上已弃用?