Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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
Java 正在寻找Spring(3.0.5)解决方案:没有绑定到线程的Hibernate会话,并且配置不允许在此创建非事务性会话_Java_Hibernate_Spring_Transactions_Spring Aop - Fatal编程技术网

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

Java 正在寻找Spring(3.0.5)解决方案:没有绑定到线程的Hibernate会话,并且配置不允许在此创建非事务性会话,java,hibernate,spring,transactions,spring-aop,Java,Hibernate,Spring,Transactions,Spring Aop,我在Spring3.0.5上有一个事务问题。在我的例子中,我得到了所谓的异常“没有绑定到线程的Hibernate会话,配置不允许在这里创建非事务会话”。。。到目前为止,我什么都试过了。我可以在日志中看到事务服务被检测并注册为SpringBean,我还可以在日志中看到它们被代理并与底层Spring事务拦截器关联。(建议)当我运行我的Spring MVC应用程序时,我的控制器将调用该服务……:-(但是事务拦截器没有被触发。(??)我希望我的Spring服务代理在调用我的目标服务方法之前打开一个会话并

我在Spring3.0.5上有一个事务问题。在我的例子中,我得到了所谓的异常“没有绑定到线程的Hibernate会话,配置不允许在这里创建非事务会话”。。。到目前为止,我什么都试过了。我可以在日志中看到事务服务被检测并注册为SpringBean,我还可以在日志中看到它们被代理并与底层Spring事务拦截器关联。(建议)当我运行我的Spring MVC应用程序时,我的控制器将调用该服务……:-(但是事务拦截器没有被触发。(??)我希望我的Spring服务代理在调用我的目标服务方法之前打开一个会话并启动一个事务。由于没有发生这种情况,我得到了上面的异常。我对这个问题已经讨论了将近两天。尝试了我在internet上找到的所有东西……但都没有成功

我有分层体系结构:表示(springmvc)、服务(事务注释)、数据访问(Spring/Hibernate classic sessionfactory).My spring上下文配置文件在appContext.xml、appContext-service.xml和appContext-dao.xml中分开。我已经定义了我的spring LocalSessionFactoryBean、Datasource和TransactionManager(HibernateTransactionManager)在appContext-dao.xml中。我将appContext-service.xml放在我的服务实现所在的位置。在我包含的所有配置文件中,我通过控制器、服务和存储库注释来检测我的bean


非常感谢您的帮助。

听起来您做的每件事都是正确的,而且您知道自己在做什么。除非您展示一些配置,否则我们在这里做不了什么

我建议进行一些调试

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

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

  • 如果它们是原始类型,则 你的交易有错误吗 配置
  • 如果它们是代理,请通过 查询方法并验证 应用事务逻辑

这听起来像是在事务结束后访问延迟加载的列表或一组您的dao。如果您在视图中而不是在控制器中访问该列表,则通常会发生这种情况,因为您的控制器可能会调用事务作用域中的方法,然后离开事务并将加载的bean转发到视图

简单解决方案:

  • 将您的数据bean配置为立即加载
  • 强制加载控制器中的依赖项(仅循环通过它们)
  • 看一看ans,这里可能也有很多,比如延迟加载/延迟获取一对多关联等等
想象一下:

// 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
}
//您的dao
公开课Foo{
//很多其他的财产
列出材料;
//东西的接受者和接受者
}
//存储库
@交易的
公共类食品回购{
公共Foo loadFoo(int-id){
...
}
}
//控制器
公共类控制器{
公共无效控制(){
sessionContext.set(“foo”,repo.loadFoo(1));//由spring管理的事务
}
public void setFooRepo(FooRepo repo){this.repo=repo};
}
//看法
for(Something:foo.getStuff()){
//Ooops事务已关闭!内容已延迟加载,因此不可用
//实际解决办法:
//-不要延迟加载(Foo.hbm.xml)
//-或通过在控制器中获取所有东西来强制加载
}

Hi Extraneon,我相信我的问题与您描述的场景无关。问题始于会话开始。此时,我的程序终止。它从未有机会访问数据库。因此,我认为这不是一个懒散的问题。您是否在春季将trasaction manager注入tx:annotation.像这样