spring.jpa.open-in-view 是 Spring Boot 中用于配置 Open EntityManager in View(Open Session in View)的属性。默认情况下,该属性的值为 true,表示开启 Open EntityManager in View 模式。
Open EntityManager in View 是一种设计模式,通常用于将 Hibernate 的 Session(或 JPA 的 EntityManager)绑定到整个请求的生命周期中。在 Spring Boot 应用程序中,当请求进入控制器处理阶段时,会打开一个 Hibernate Session 或 JPA EntityManager,以便在视图渲染阶段(通常是 Thymeleaf、JSP 或其他模板引擎)中能够懒加载关联的实体对象。
开启 Open EntityManager in View 可以确保在视图渲染时,仍然可以懒加载相关的实体对象,避免了在视图渲染阶段因为延迟加载而导致的懒加载异常。但是,尽管 Open EntityManager in View 提供了便利,但也可能会带来一些潜在的性能问题,因为会导致 Hibernate Session 或 JPA EntityManager 在整个请求生命周期中持续存在,增加了数据库连接的使用时间。
如果您的应用程序使用了延迟加载(懒加载)的实体对象,并且希望在视图渲染时仍然能够访问这些实体对象,那么可以将 spring.jpa.open-in-view 设置为 true。但是,如果您的应用程序没有使用延迟加载或者已经处理了懒加载异常,那么可以将其设置为 false,以提高性能。
例如,在 application.properties 中设置
# 默认配置(即使你不显式配置)
spring:
jpa:
open-in-view: true # Spring Boot 2.x 默认开启 3.x默认关闭
spring.jpa.open-in-view 是Spring Boot的一个配置,默认值为 true。它的作用是:
open-in-view=true 的工作原理
-
视图渲染期间保持Session打开:
-
事务在Controller方法结束后就提交了
-
但是Hibernate Session会一直保持打开状态,直到视图渲染完成
-
这意味着数据库连接会被占用更长时间
-
-
典型的请求处理流程:
请求开始
↓
OpenSessionInViewFilter/Interceptor 打开Session
↓
Controller → Service → Repository (事务开始、提交)
↓
视图渲染(JSON序列化、JSP渲染等)← Session仍然打开!
↓
OpenSessionInViewFilter/Interceptor 关闭Session
↓
请求结束
参考文章: