Spring执行了一个没有事务的查询?
我正在使用spring和spring数据jpa(hibernate作为实现)。我的控制器操作中有以下代码行:Spring执行了一个没有事务的查询?,spring,hibernate,spring-boot,spring-transactions,Spring,Hibernate,Spring Boot,Spring Transactions,我正在使用spring和spring数据jpa(hibernate作为实现)。我的控制器操作中有以下代码行: Flat flat = flatService.find(id); FlatService是一个用spring@Transactional注释的spring服务。所以在调用find方法之后,我应该分离实体。此实体与用户集合具有惰性关联。稍后在我的代码中,我将访问这个属性,我希望抛出延迟初始化异常,但是从数据库中检索集合时没有任何异常。我启用了事务日志,如下所示: 2015-09-16
Flat flat = flatService.find(id);
FlatService是一个用spring@Transactional注释的spring服务。所以在调用find方法之后,我应该分离实体。此实体与用户集合具有惰性关联。稍后在我的代码中,我将访问这个属性,我希望抛出延迟初始化异常,但是从数据库中检索集合时没有任何异常。我启用了事务日志,如下所示:
2015-09-16 18:13:15.354跟踪s.t.s.TransactionSynchronizationManager:绑定值
2015-09-16 18:13:15.354跟踪s.t.s.TransactionSynchronizationManager:检索到的值
2015-09-16 18:13:15.360跟踪s.t.s.TransactionSynchronizationManager:绑定值
2015-09-16 18:13:15.360跟踪s.t.s.事务同步管理器:初始化事务同步
2015-09-16 18:13:15.360跟踪o.s.t.i.交易接收器:获取[FlatService.find]的交易
2015-09-16 18:13:15.360跟踪s.t.s.TransactionSynchronizationManager:检索到的值
2015-09-16 18:13:15.360调试org.hibernate.SQL:选择flat0_uu2;id作为…-这是对公寓的查询
2015-09-16 18:13:15.364跟踪o.s.t.i.交易接收器:完成[FlatService.find]的交易
2015-09-16 18:13:15.366跟踪s.t.s.交易同步管理器:清算交易同步
2015-09-16 18:13:15.368跟踪s.t.s.TransactionSynchronizationManager:删除的值
2015-09-16 18:13:15.372 DEBUG org.hibernate.SQL:选择users0\u.flat\u id作为flat\u id 6\u 3\u 0\u…-这是没有事务的用户集合的查询
2015-09-16 18:13:15.375跟踪s.t.s.TransactionSynchronizationManager:删除的值
2015-09-16 18:13:15.556跟踪s.t.s.TransactionSynchronizationManager:绑定值
2015-09-16 18:13:15.557跟踪s.t.s.事务同步管理器:
删除值
有人能解释为什么spring能够在没有事务的情况下获取我的惰性集合吗?读取块不需要spring事务。您的“会话”仍处于打开状态,因此您可以懒洋洋地阅读。我很困惑,文档中是否指定了它?如果我的“会话”仍处于打开状态,那么为什么需要OpenSessionInViewFilter?很可能正是这样一个
OpenSessionInViewFilter/拦截器处于活动状态。您可以在事务管理器内部进行调试并检查第一次调用它的堆栈。但是从日志中我可以看到find方法在事务边界内执行,并且在find方法完成后事务关闭。OpenSessionInViewFilter只是一个servlet过滤器,它将hibernate会话绑定到用于请求的整个处理的线程。因此,即使对标记为@transaction的方法(或类)的调用已经完成,您的会话仍然可以在线程中使用。