Spring数据JPA+;Hibernate:如何在线程之间共享Hibernate会话?

Spring数据JPA+;Hibernate:如何在线程之间共享Hibernate会话?,hibernate,jpa-2.0,spring-data,Hibernate,Jpa 2.0,Spring Data,在涉及@Entity实例的计算中,一个线程a创建一个新线程B。线程a持有对该实体的引用,并将该引用传递给线程B 线程A负责为单个HTTP请求提供服务,在存储库中查找实体,并发送HTTP响应。 线程B负责一些涉及该实体的长时间运行的计算。 问:我为什么选择两个线程?答:我不想要一个长时间运行的HTTP请求-响应周期;相反,我希望有一个快速的HTTP请求-响应周期,快速响应“计算开始”给我的用户 从线程A访问实体是完美的。 但是从线程B访问实体不起作用:当我尝试访问实体关系(它应该从Hibernat

在涉及
@Entity
实例的计算中,一个线程a创建一个新线程B。线程a持有对该实体的引用,并将该引用传递给线程B

线程A负责为单个HTTP请求提供服务,在存储库中查找实体,并发送HTTP响应。
线程B负责一些涉及该实体的长时间运行的计算。
问:我为什么选择两个线程?答:我不想要一个长时间运行的HTTP请求-响应周期;相反,我希望有一个快速的HTTP请求-响应周期,快速响应“计算开始”给我的用户

从线程A访问实体是完美的。
但是从线程B访问实体不起作用:当我尝试访问实体关系(它应该从Hibernate懒洋洋地获取数据)时,我得到异常
org.Hibernate.LazyInitializationException:无法初始化代理-没有会话

JPA/Hibernate会话的作用域是单个线程吗?即创建该会话的线程(在我的例子中是线程a,因为这是查询我的实体存储库的线程)如果是这种情况,如何使多个线程共享一个Hibernate会话,以便可以使用来自多个线程的同一实体?


将实体的关系行为更改为“急切加载”不是可行的解决方案。我也在寻找一种对我的域类/实体无干扰的解决方案(例如,我不想在我的域类中使用
PersistenceContext
EntityManager
来重新附加分离的实体。

根据Java文档,a会话不打算由多个线程使用。
在同时处理分离的entity之前,需要使用
execute
将对象从线程A中的会话中分离。请记住,如果需要的属性和惰性属性尚未从数据库中读取,则会抛出
org.hibernate.lazyiInitializationException


完成后,您需要调用
merge
,以便将实体重新附加到会话,然后保存它或其他任何内容。

来自hibernate文档的“它[session]并不意味着实现者是线程安全的。相反,每个线程/事务都应该获得自己的”。您需要分离对象并将其重新匹配到另一个线程的会话。@bmorris591那么这是否意味着基本上不可能/不允许从两个或多个线程同时处理JPA实体?不是附加的线程。在分离的线程上,所有与线程/锁定相关的警告都适用。现在出现了以下问题:我如何才能l“Spring”/“Spring Data JPA”来重新连接我的实体?请看一下。我会尝试一下您的建议,然后报告它是如何工作的