You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中EntityManager(Session)的创建时机是请求阶段还是事务启动时?

你提到的两种描述并不冲突,分别对应Spring下是否开启**Open Session In View(OSIV)**功能的两种场景:

  • 当项目开启OSIV(Spring Boot 2.x+ 默认开启)时,和Baeldung文章的描述完全一致:

Spring会在请求开始时打开一个新的Hibernate Session,这些Session不一定会连接到数据库。
这个阶段只是初始化了Session的空实例,不会立刻申请数据库连接,只有当第一次执行SQL操作、或者进入事务逻辑时,才会真正从连接池获取连接。OSIV设计的初衷是为了避免Controller层返回实体时触发懒加载异常,保证序列化阶段Session仍处于打开状态。

  • 当项目主动关闭OSIV时,你的理解完全正确:Spring不会在请求层提前绑定Session,只有当执行到标注了@Transactional的方法、事务管理器启动事务时,才会初始化EntityManager(即Hibernate Session实例),这种模式避免了为无数据库操作的请求创建冗余的Session,资源利用率更高。

你给出的示例代码就是关闭OSIV后的典型表现:

@Transactional
@Service
public class DoService {
      // 只有调用该Service的事务方法时,EntityManager才会被创建
}

如果需要确认当前项目的OSIV状态,可以查看配置项spring.jpa.open-in-view的取值,默认不配置的情况下为true。

内容的提问来源于stack exchange,提问作者paiwmsn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:39:04