Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring执行了一个没有事务的查询?_Spring_Hibernate_Spring Boot_Spring Transactions - Fatal编程技术网

Spring执行了一个没有事务的查询?

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

我正在使用spring和spring数据jpa(hibernate作为实现)。我的控制器操作中有以下代码行:

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的方法(或类)的调用已经完成,您的会话仍然可以在线程中使用。