繁体   English   中英

寻求针对(3.0.5)的Spring解决方案:没有Hibernate Session绑定到线程,并且配置不允许在此处创建非事务性会话

[英]Seeking a Spring (3.0.5) Solution for: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

我在Spring 3.0.5上有一个交易问题。 就我而言,我得到了所谓的异常“没有Hibernate Session绑定到线程,并且配置不允许在此处创建非事务性会话”……到目前为止,我已经尝试了所有方法。 我可以在日志中看到已检测到事务服务并将其注册为Spring Bean,还可以在日志中看到它们已被代理并与基础Spring事务拦截器相关联。 (建议)当我运行Spring MVC应用程序时,我的控制器将调用该服务...... :-(但是不会触发事务拦截器。(??)我希望我的Spring服务代理打开一个会话并启动一个在调用我的目标服务方法之前进行事务处理。由于这种情况没有发生,所以我得到了上面的异常。我已经花了将近两天的时间了,尝试了我在互联网上发现的所有内容,但是徒劳无功。

我有分层的体系结构:表示(springmvc),服务(带事务注释),数据访问(Spring / Hibernate经典sessionfactory)。 我的模型对象使用jpa(javax.persistence。*)进行了注释。 我的spring上下文配置文件位于appContext.xml,appContext-service.xml和appContext-dao.xml中。 我已经在appContext-dao.xml中定义了Spring LocalSessionFactoryBean,Datasource和TransactionManager(HibernateTransactionManager)。 我已将appContext-service.xml放入我的服务实现所在的位置。 在我所有的配置文件中,都包含并通过Controller,Service和Repository批注检测我的bean。

我感谢任何帮助。

听起来您做的一切正确,并且知道自己在做什么。 除非您显示一些配置,否则我们在这里无能为力。

我建议进行一些调试。

第一:在服务层中是否有单元测试可以测试您正在使用的查询? 也许您可以在服务层中找到错误。

然后:调试MVC应用程序,检查注入的服务的类型。 验证它们是代理,而不是原始类型。

  • 如果它们是原始类型,则您的事务配置中有错误。
  • 如果它们是代理,请遍历查询方法并验证是否应用了事务逻辑。

这听起来像是在事务结束后访问延迟加载的列表或一组您的请求。 如果您代替控制器访问视图中的该列表,通常会发生这种情况,因为您的控制器可能会调用事务范围内的方法,然后离开该事务并将加载的Bean转发到视图。

简单的解决方案:

  • 配置您的数据Bean以热切加载
  • 在控制器中强制加载依赖项(只需循环遍历它们)
  • 看一下这篇文章,可能还有很多关于延迟加载/延迟获取一对多关联的信息等等。

想像:

// your dao
public class Foo {
    // lots of other properties
    List<Something> stuff;
    // getters and setter for stuff
}

// repository
@Transactional 
public class FooRepo {
    public Foo loadFoo(int id) {
       ...
    }
}

// Controller
public class Controller {
   public void Control() {
       sessionContext.set("foo", repo.loadFoo(1)); // transaction managed by spring
   }
   public void setFooRepo(FooRepo repo) {this.repo = repo};
}

// View
for (Something something : foo.getStuff()) {
    // Ooops transaction is closed! stuff is lazily loaded so NOT AVAILABLE
    // practical solutions:
    // - do not load lazily (Foo.hbm.xml)
    // - or force loading by getting all Somethings in the controller
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM