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
相关产品推荐
相关产品推荐

