2

在涉及@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 行为更改为“急切加载”不是一个可行的解决方案。我还在寻找一种对我的域类/实体无干扰的解决方案(例如,我不想在我的域类中使用PersistenceContextorEntityManager来重新附加分离的实体。

4

1 回答 1

1

根据会话的 Javadocs,会话不打算由多个线程使用。在同时处理分离的实体之前,
您需要将对象从线程 A 中的会话中分离出来。evict请记住,org.hibernate.LazyInitializationException如果您需要尚未从数据库中读取的惰性属性,则会抛出此错误。
完成后,您需要调用merge以将实体重新附加到会话,然后保存它或其他。

于 2013-02-16T16:31:22.500 回答