在涉及@Entity
实例的计算中,一个线程A创建一个新线程B.线程A保存对该实体的引用,并将该引用传递给线程B.
线程A负责提供单个HTTP请求,在存储库中查找实体,以及发送HTTP响应。 线程B负责涉及该实体的一些长时间运行的计算 问:为什么我选择两个线程?答:我不希望长时间运行的HTTP请求 - 响应周期;相反,我希望有一个快速的HTTP请求 - 响应周期,可以快速响应“计算开始”给我的用户。
从线程A访问实体是完美无缺的
但是从线程B访问实体是行不通的:当我尝试访问实体关系(应该懒散地从Hibernate获取数据)时,我得到异常org.hibernate.LazyInitializationException: could not initialize proxy - no Session
。
JPA / Hibernate会话是否限定为单个线程 - 即创建该会话的线程(在我的情况下是线程A,因为这是查询我的实体存储库的线程)? 如果是这种情况,我怎样才能让多个线程共享一个Hibernate会话,以便我可以从多个线程中使用同一个实体?
将我的实体的关系行为改为“急切加载”并不是一个可行的解决方案。我也在寻找一种非侵入式域类/实体的解决方案(例如,我不想在我的域类中使用PersistenceContext
或EntityManager
来重新附加分离的实体
答案 0 :(得分:1)
根据session的Javadocs,多个线程不打算使用会话。
在同时处理分离的enitity之前,需要使用evict
从线程A中的会话中分离对象。请记住,如果您需要尚未从数据库中读取的惰性属性,则会抛出org.hibernate.LazyInitializationException
。
当你完成后,你需要调用merge
以便将实体重新连接到一个会话,然后保存它或其他任何内容。