Java Hibernate@Async未来结果和延迟初始化异常

Java Hibernate@Async未来结果和延迟初始化异常,java,spring,hibernate,Java,Spring,Hibernate,我有控制器方法和一些服务方法,我想并行使用它们 控制器方法 public String (...) { Future<List<Obj1>> obj1Result= asyncDelegate.getAllObj1(); Future<List<Obj2>> obj2Result= asyncDelegate.getAllObj2(); Future<List<Obj3>> obj3Result= a

我有控制器方法和一些服务方法,我想并行使用它们

控制器方法

public String (...) {
    Future<List<Obj1>> obj1Result= asyncDelegate.getAllObj1();
    Future<List<Obj2>> obj2Result= asyncDelegate.getAllObj2();
    Future<List<Obj3>> obj3Result= asyncDelegate.getAllObj3();

    while(!(obj1Result.isDone() && obj2Result.isDone() && obj3Result.isDone())) {
        Thread.sleep(10);
    }
    model.addAttribute(...);
    return "view";
}
}

Obj1、Obj2、Obj2具有惰性初始化集合,以便在我使用的视图中加载它们

<filter>
    <filter-name>openSessionInView</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
     <async-supported>true</async-supported>
</filter>

如何解决此问题?

您的问题是Spring在ThreadLocal中使用所有hibernate配置运行,而您正在使用自己的thread local创建新线程,而hibernate会话不存在


因此,如果这些实体已在上一个线程中创建,则需要初始化它们的会话,否则hibernate无法初始化这些hibernate代理实体,因为会话不存在。

您的问题是Spring正在ThreadLocal中运行所有hibernate配置,您正在使用自己的线程本地创建新线程,而Hibernate会话不存在


因此,如果这些实体已在前一个线程中创建,则需要初始化它们的会话,否则,由于会话不存在,hibernate无法初始化这些hibernate代理实体。

当您确定代理将在加载它们的会话之外使用时,可以显式初始化代理:

Hibernate.initialize(obj.getLazyCollection());

在加载
obj

的同一事务中调用此命令,当您确定代理将在加载它们的会话之外使用时,可以显式初始化代理:

Hibernate.initialize(obj.getLazyCollection());

在加载
obj

的同一个事务中调用此函数,在我的例子中,我所做的是使用Async method创建一个中间层,控制器-->服务,使用@Transactional创建一个中间层,然后在新线程中从头开始一个新事务。在我的例子中,我所做的是创建一个中间层,控制器-->使用异步方法的服务-->使用@Transactional的服务,然后在新的threadLocal中从头开始新的事务
Hibernate.initialize(obj.getLazyCollection());