ManagedSessionContext
和ThreadLocalSessionContext
之间的差异在维护会话的实现中都有ThreadLocal
答案 0 :(得分:3)
ThreadLocalSessionContext
- 它负责hibernate会话管理活动,如:
sessionFactory.getCurrentSession()
返回此绑定会话,并在事务完成后解除绑定。 ManagedSessionContext
- 上述会话管理活动的责任由一些外部实体(通常是某种形式的拦截器等)处理。
在这两种情况下,会话都存储在ThreadLocal中。
但是通过外部实体定义了对会话的绑定/取消绑定的调用,特别是何时调用会话的flush和close。
这提供了更大的灵活性,例如,在ThreadLocalSessionContext
的情况下,会话在事务结束时自动关闭,并且无法使会话保持打开状态以满足多请求会话类型的要求。 / p>
如果是ManagedSessionContext
,我们可以实现多请求对话(a.k.a session-per-conversation model
),同一会话需要保持打开状态,并且应该在用户请求中重复使用。因此,在第一个用户请求中,我们插入/更新/删除一些实体,在下一个请求中我们执行更多操作,最后在第三次交互结束时,我们要提交数据。
引自Managing the current Session section
当对话开始时,必须打开一个新的Session并与ManagedSessionContext.bind()绑定,以便为对话中的第一个请求提供服务。您还必须在该新会话上设置FlushMode.MANUAL,因为您不希望在您的背后发生任何持久性上下文同步。
现在调用sessionFactory.getCurrentSession()的所有数据访问代码都会收到您绑定的Session。
当对话中的请求完成时,您需要调用Managed-SessionContext.unbind()并将现在断开连接的Session存储到某个位置,直到对话中的下一个请求完成为止。或者,如果这是对话中的最后一个请求,则需要刷新并关闭会话。
以图形方式表示,
Session-per-conversation
实施了会话范围
您可以浏览此链接的Listing 11.5以获取管理session-per-conversation
模型会话的拦截器示例实现。