在涉及@Entity
实例的计算中,一个线程 A 创建一个新线程 B。线程 A 持有对该实体的引用并将该引用传递给线程 B。
线程 A 负责处理单个 HTTP 请求、在存储库中查找实体并发送 HTTP 响应。
线程 B 负责一些涉及该实体的长时间运行的计算。
问:为什么我选择了两个线程?A:我不想要一个长时间运行的 HTTP 请求-响应周期;相反,我希望有一个快速的 HTTP 请求-响应周期,可以快速向我的用户响应“计算开始”。
从线程 A 访问实体完美无缺。
但是从线程 B 访问实体不起作用:当我尝试访问实体关系(应该从 Hibernate 懒惰地获取数据)时,我得到了异常org.hibernate.LazyInitializationException: could not initialize proxy - no Session
。
JPA/Hibernate 会话是否仅限于单个线程 - 即创建该会话的线程(在我的情况下是线程 A,因为这是查询我的存储库以获取实体的线程)?如果是这种情况,我怎样才能让多个线程共享一个 Hibernate 会话,以便我可以从多个线程处理同一个实体?
将我的实体的 relashionship 行为更改为“急切加载”不是一个可行的解决方案。我还在寻找一种对我的域类/实体无干扰的解决方案(例如,我不想在我的域类中使用PersistenceContext
orEntityManager
来重新附加分离的实体。